// RUN: rm -rf %t // RUN: %clang_cc1 -x c++ -std=c++20 %s -verify -fmodules -fmodules-cache-path=%t // expected-no-diagnostics #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"));