xref: /llvm-project/clang/test/Modules/merge-concepts.cpp (revision 42f87bb62d0719848842da60d2a8180b9e4d7c52)
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 Biryukov template <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 Biryukov template <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 Biryukov template <class T> void bar()
8159179d72SIlya Biryukov   requires same_as<T, int>
8259179d72SIlya Biryukov {}
8359179d72SIlya Biryukov 
8459179d72SIlya Biryukov #endif // FORMAT_H
85