xref: /llvm-project/clang/test/Modules/merge-concepts-cxx-modules.cpp (revision da00c60dae0040185dc45039c4397f6e746548e9)
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 -std=c++20 -emit-module-interface %t/same_as.cppm -o %t/same_as.pcm
659179d72SIlya Biryukov // RUN: %clang_cc1 -std=c++20 -emit-module-interface -fprebuilt-module-path=%t %t/concepts.cppm -o %t/concepts.pcm
759179d72SIlya Biryukov // RUN: %clang_cc1 -std=c++20 -emit-module-interface -fprebuilt-module-path=%t %t/format.cppm -o %t/format.pcm
859179d72SIlya Biryukov // RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/conflicting.cppm -o %t/conflicting.pcm
959179d72SIlya Biryukov // RUN: %clang_cc1 -std=c++20 -fprebuilt-module-path=%t %t/Use.cppm -fsyntax-only -verify
1059179d72SIlya Biryukov 
11*da00c60dSChuanqi Xu // Test again with reduced BMI.
12*da00c60dSChuanqi Xu // RUN: rm -rf %t
13*da00c60dSChuanqi Xu // RUN: mkdir %t
14*da00c60dSChuanqi Xu // RUN: split-file %s %t
15*da00c60dSChuanqi Xu //
16*da00c60dSChuanqi Xu // RUN: %clang_cc1 -std=c++20 -emit-reduced-module-interface %t/same_as.cppm -o %t/same_as.pcm
17*da00c60dSChuanqi Xu // RUN: %clang_cc1 -std=c++20 -emit-reduced-module-interface -fprebuilt-module-path=%t %t/concepts.cppm -o %t/concepts.pcm
18*da00c60dSChuanqi Xu // RUN: %clang_cc1 -std=c++20 -emit-reduced-module-interface -fprebuilt-module-path=%t %t/format.cppm -o %t/format.pcm
19*da00c60dSChuanqi Xu // RUN: %clang_cc1 -std=c++20 -emit-reduced-module-interface %t/conflicting.cppm -o %t/conflicting.pcm
20*da00c60dSChuanqi Xu // RUN: %clang_cc1 -std=c++20 -fprebuilt-module-path=%t %t/Use.cppm -fsyntax-only -verify
21*da00c60dSChuanqi Xu 
22*da00c60dSChuanqi Xu 
2359179d72SIlya Biryukov //--- same_as.cppm
2459179d72SIlya Biryukov export module same_as;
2559179d72SIlya Biryukov export template <class T, class U>
2659179d72SIlya Biryukov concept same_as = __is_same(T, U);
2759179d72SIlya Biryukov 
2859179d72SIlya Biryukov //--- concepts.cppm
2959179d72SIlya Biryukov export module concepts;
3059179d72SIlya Biryukov export import same_as;
3159179d72SIlya Biryukov 
3259179d72SIlya Biryukov export template <class T>
3359179d72SIlya Biryukov concept ConflictingConcept = true;
3459179d72SIlya Biryukov 
3559179d72SIlya Biryukov //--- format.cppm
3659179d72SIlya Biryukov 
3759179d72SIlya Biryukov export module format;
3859179d72SIlya Biryukov export import concepts;
3959179d72SIlya Biryukov export import same_as;
4059179d72SIlya Biryukov 
foo()4159179d72SIlya Biryukov export template <class T> void foo()
4259179d72SIlya Biryukov   requires same_as<T, int>
4359179d72SIlya Biryukov {}
4459179d72SIlya Biryukov 
4559179d72SIlya Biryukov //--- conflicting.cppm
4659179d72SIlya Biryukov export module conflicting;
4759179d72SIlya Biryukov export template <class T, class U = int>
4859179d72SIlya Biryukov concept ConflictingConcept = true;
4959179d72SIlya Biryukov 
5059179d72SIlya Biryukov //--- Use.cppm
5159179d72SIlya Biryukov import format;
5259179d72SIlya Biryukov import conflicting;
5359179d72SIlya Biryukov 
foo()5459179d72SIlya Biryukov template <class T> void foo()
5559179d72SIlya Biryukov   requires same_as<T, T>
5659179d72SIlya Biryukov {}
5759179d72SIlya Biryukov ConflictingConcept auto x = 10; // expected-error {{reference to 'ConflictingConcept' is ambiguous}}
5859179d72SIlya Biryukov                                 // expected-note@* 2 {{candidate}}
59