| // 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 { | |
| module concepts {} | |
| module functional {} | |
| } | |
| #pragma clang module contents | |
| #pragma clang module begin std | |
| template <class _Tp> struct common_reference { | |
| using type = _Tp; | |
| }; | |
| #pragma clang module end | |
| #pragma clang module begin std.concepts | |
| #pragma clang module import std | |
| template <class _Tp> | |
| concept same_as = __is_same(_Tp, _Tp); | |
| template <class _Tp> | |
| concept common_reference_with = | |
| same_as<typename common_reference<_Tp>::type>; | |
| #pragma clang module end | |
| #pragma clang module begin std.functional | |
| #pragma clang module import std.concepts | |
| template <class, class _Ip> | |
| concept sentinel_for = common_reference_with<_Ip>; | |
| constexpr bool ntsf_subsumes_sf(sentinel_for<char *> auto) | |
| requires true | |
| { | |
| return true; | |
| } | |
| bool ntsf_subsumes_sf(sentinel_for<char *> auto); | |
| static_assert(ntsf_subsumes_sf("")); | |
| #pragma clang module end | |
| #pragma clang module endbuild |