15e01234dSErich Keane // RUN: rm -rf %t 25e01234dSErich Keane // RUN: %clang_cc1 -x c++ -std=c++20 %s -verify -fmodules -fmodules-cache-path=%t 3*9e9d98aaSMatheus Izvekov // expected-no-diagnostics 4*9e9d98aaSMatheus Izvekov 55e01234dSErich Keane #pragma clang module build std 65e01234dSErich Keane module std [system] { 75e01234dSErich Keane module concepts [system] { 85e01234dSErich Keane module assignable [system] { 95e01234dSErich Keane } 105e01234dSErich Keane export * 115e01234dSErich Keane } 125e01234dSErich Keane module functional [system] { 135e01234dSErich Keane export * 145e01234dSErich Keane } 155e01234dSErich Keane 165e01234dSErich Keane 175e01234dSErich Keane module type_traits [system] { 185e01234dSErich Keane export * 195e01234dSErich Keane } 205e01234dSErich Keane } 215e01234dSErich Keane 225e01234dSErich Keane #pragma clang module contents 235e01234dSErich Keane #pragma clang module begin std.type_traits 245e01234dSErich Keane namespace std { 255e01234dSErich Keane template<class _Tp, class _Up> 265e01234dSErich Keane concept same_as = __is_same(_Tp, _Up); 275e01234dSErich Keane 285e01234dSErich Keane template <class...> 295e01234dSErich Keane struct common_reference; 305e01234dSErich Keane 315e01234dSErich Keane template <class _Tp, class _Up> struct common_reference<_Tp, _Up> 325e01234dSErich Keane { 335e01234dSErich Keane using type = _Tp; 345e01234dSErich Keane }; 355e01234dSErich Keane } 365e01234dSErich Keane #pragma clang module end // type_traits 375e01234dSErich Keane 385e01234dSErich Keane #pragma clang module begin std.concepts.assignable 395e01234dSErich Keane #pragma clang module import std.type_traits 405e01234dSErich Keane namespace std { 415e01234dSErich Keane template<class _Tp, class _Up> 425e01234dSErich Keane concept common_reference_with = 435e01234dSErich Keane same_as<typename common_reference<_Tp, _Up>::type, typename common_reference<_Up, _Tp>::type>; 445e01234dSErich Keane } 455e01234dSErich Keane namespace std { 465e01234dSErich Keane template<class _Lhs, class _Rhs> 475e01234dSErich Keane concept assignable_from = 485e01234dSErich Keane common_reference_with<const __remove_reference_t(_Lhs)&, const __remove_reference_t(_Rhs)&> ; 495e01234dSErich Keane } 505e01234dSErich Keane #pragma clang module end // std.concepts.assignable 515e01234dSErich Keane 525e01234dSErich Keane #pragma clang module begin std.functional 535e01234dSErich Keane #pragma clang module import std.concepts.assignable 545e01234dSErich Keane namespace std { 555e01234dSErich Keane template<class _Sp, class _Ip> 565e01234dSErich Keane concept sentinel_for = assignable_from<_Ip&, _Ip>; 575e01234dSErich Keane template <class _Sp, class _Ip> 585e01234dSErich Keane concept nothrow_sentinel_for = sentinel_for<_Sp, _Ip>; 595e01234dSErich Keane } 605e01234dSErich Keane #pragma clang module end // std::functional 615e01234dSErich Keane #pragma clang module endbuild // contents 625e01234dSErich Keane 635e01234dSErich Keane 645e01234dSErich Keane #pragma clang module import std.functional 655e01234dSErich Keane constexpr bool ntsf_subsumes_sf(std::nothrow_sentinel_for<char*> auto) requires true { 665e01234dSErich Keane return true; 675e01234dSErich Keane } 685e01234dSErich Keane constexpr bool ntsf_subsumes_sf(std::sentinel_for<char*> auto); 695e01234dSErich Keane static_assert(ntsf_subsumes_sf("foo")); 70