159179d72SIlya Biryukov // RUN: rm -rf %t 259179d72SIlya Biryukov // RUN: mkdir %t 359179d72SIlya Biryukov // RUN: split-file %s %t 459179d72SIlya Biryukov // 559179d72SIlya Biryukov // RUN: %clang_cc1 -xc++ -std=c++20 -fmodules -fmodule-name=library \ 659179d72SIlya Biryukov // RUN: -emit-module %t/modules.map \ 759179d72SIlya Biryukov // RUN: -o %t/module.pcm 859179d72SIlya Biryukov // 959179d72SIlya Biryukov // 1059179d72SIlya Biryukov // RUN: %clang_cc1 -xc++ -std=c++20 -fmodules -fmodule-file=%t/module.pcm \ 1159179d72SIlya Biryukov // RUN: -fmodule-map-file=%t/modules.map \ 1259179d72SIlya Biryukov // RUN: -fsyntax-only -verify %t/use.cpp 1359179d72SIlya Biryukov // 1459179d72SIlya Biryukov //--- use.cpp 1559179d72SIlya Biryukov // expected-no-diagnostics 1659179d72SIlya Biryukov 1759179d72SIlya Biryukov #include "concepts.h" 1859179d72SIlya Biryukov #include "format.h" 1959179d72SIlya Biryukov foo()2059179d72SIlya Biryukovtemplate <class T> void foo() 2159179d72SIlya Biryukov requires same_as<T, T> 2259179d72SIlya Biryukov {} 2359179d72SIlya Biryukov 2459179d72SIlya Biryukov //--- modules.map 2559179d72SIlya Biryukov module "library" { 2659179d72SIlya Biryukov export * 2759179d72SIlya Biryukov module "concepts" { 2859179d72SIlya Biryukov export * 2959179d72SIlya Biryukov header "concepts.h" 3059179d72SIlya Biryukov } 31*42f87bb6SIlya Biryukov module "compare" { 32*42f87bb6SIlya Biryukov export * 33*42f87bb6SIlya Biryukov header "compare.h" 34*42f87bb6SIlya Biryukov } 3559179d72SIlya Biryukov module "format" { 3659179d72SIlya Biryukov export * 3759179d72SIlya Biryukov header "format.h" 3859179d72SIlya Biryukov } 3959179d72SIlya Biryukov } 4059179d72SIlya Biryukov 4159179d72SIlya Biryukov //--- concepts.h 4259179d72SIlya Biryukov #ifndef SAMEAS_CONCEPTS_H_ 4359179d72SIlya Biryukov #define SAMEAS_CONCEPTS_H_ 4459179d72SIlya Biryukov 4559179d72SIlya Biryukov #include "same_as.h" 4659179d72SIlya Biryukov 4759179d72SIlya Biryukov #endif // SAMEAS_CONCEPTS_H 4859179d72SIlya Biryukov 4959179d72SIlya Biryukov //--- same_as.h 5059179d72SIlya Biryukov #ifndef SAME_AS_H 5159179d72SIlya Biryukov #define SAME_AS_H 5259179d72SIlya Biryukov 5359179d72SIlya Biryukov template <class T, class U> 54*42f87bb6SIlya Biryukov concept same_as_impl = __is_same(T, U); 5559179d72SIlya Biryukov 56*42f87bb6SIlya Biryukov template <class T, class U> 57*42f87bb6SIlya Biryukov concept same_as = same_as_impl<T, U> && same_as_impl<U, T>; 5859179d72SIlya Biryukov #endif // SAME_AS_H 5959179d72SIlya Biryukov 60*42f87bb6SIlya Biryukov 61*42f87bb6SIlya Biryukov //--- compare.h 62*42f87bb6SIlya Biryukov #ifndef COMPARE_H 63*42f87bb6SIlya Biryukov #define COMPARE_H 64*42f87bb6SIlya Biryukov 65*42f87bb6SIlya Biryukov #include "same_as.h" 66*42f87bb6SIlya Biryukov #include "concepts.h" 67*42f87bb6SIlya Biryukov foo()68*42f87bb6SIlya Biryukovtemplate <class T> void foo() 69*42f87bb6SIlya Biryukov requires same_as<T, int> 70*42f87bb6SIlya Biryukov {} 71*42f87bb6SIlya Biryukov #endif // COMPARE_H 72*42f87bb6SIlya Biryukov 7359179d72SIlya Biryukov //--- format.h 7459179d72SIlya Biryukov #ifndef FORMAT_H 7559179d72SIlya Biryukov #define FORMAT_H 7659179d72SIlya Biryukov 7759179d72SIlya Biryukov #include "same_as.h" 78*42f87bb6SIlya Biryukov #include "concepts.h" 7959179d72SIlya Biryukov bar()80*42f87bb6SIlya Biryukovtemplate <class T> void bar() 8159179d72SIlya Biryukov requires same_as<T, int> 8259179d72SIlya Biryukov {} 8359179d72SIlya Biryukov 8459179d72SIlya Biryukov #endif // FORMAT_H 85