// RUN: rm -rf %t // RUN: %clang_cc1 -x c++ -std=c++20 %s -verify -fmodules -fmodules-cache-path=%t #pragma clang module build std module std [system] { module concepts [system] { module assignable [system] { } export * } module functional [system] { export * } module type_traits [system] { export * } } #pragma clang module contents #pragma clang module begin std.type_traits namespace std { template concept same_as = __is_same(_Tp, _Up); template struct common_reference; template struct common_reference<_Tp, _Up> { using type = _Tp; }; } #pragma clang module end // type_traits #pragma clang module begin std.concepts.assignable #pragma clang module import std.type_traits namespace std { template concept common_reference_with = same_as::type, typename common_reference<_Up, _Tp>::type>; } namespace std { template concept assignable_from = common_reference_with ; } #pragma clang module end // std.concepts.assignable #pragma clang module begin std.functional #pragma clang module import std.concepts.assignable namespace std { template concept sentinel_for = assignable_from<_Ip&, _Ip>; template concept nothrow_sentinel_for = sentinel_for<_Sp, _Ip>; } #pragma clang module end // std::functional #pragma clang module endbuild // contents #pragma clang module import std.functional constexpr bool ntsf_subsumes_sf(std::nothrow_sentinel_for auto) requires true { return true; } constexpr bool ntsf_subsumes_sf(std::sentinel_for auto); static_assert(ntsf_subsumes_sf("foo")); // Note: Doing diagnostics verify lines in the individual modules isn't // permitted, and using 'bookmarks' in a module also doesn't work, so we're // forced to diagnose this by line-number. // // Check to ensure that this error happens, prior to a revert of a concepts // sugaring patch, this diagnostic didn't happen correctly. // expected-error@* {{partial specialization of 'common_reference<_Tp, _Up>' must be imported from module 'std.type_traits' before it is required}} // expected-note@63 {{while substituting into concept arguments here}} // expected-note@*{{partial specialization declared here is not reachable}}