Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / clang / test / Modules / merge-requires-with-lambdas.cppm
blob5767492047684b90ef1090636a0a8607b8c7a328
1 // Tests that we can merge the concept declarations with lambda well.
2 //
3 // RUN: rm -rf %t
4 // RUN: mkdir -p %t
5 // RUN: split-file %s %t
6 //
7 // RUN: %clang_cc1 -std=c++20 %t/A.cppm -emit-module-interface -o %t/A.pcm
8 // RUN: %clang_cc1 -std=c++20 %t/A0.cppm -emit-module-interface -o %t/A0.pcm
9 // RUN: %clang_cc1 -std=c++20 %t/TestA.cpp -fprebuilt-module-path=%t -fsyntax-only -verify
11 // RUN: %clang_cc1 -std=c++20 %t/A1.cppm -emit-module-interface -o %t/A1.pcm
12 // RUN: %clang_cc1 -std=c++20 %t/TestA1.cpp -fprebuilt-module-path=%t -fsyntax-only -verify
14 // RUN: %clang_cc1 -std=c++20 %t/A2.cppm -emit-module-interface -o %t/A2.pcm
15 // RUN: %clang_cc1 -std=c++20 %t/TestA2.cpp -fprebuilt-module-path=%t -fsyntax-only -verify
17 // RUN: %clang_cc1 -std=c++20 %t/A3.cppm -emit-module-interface -o %t/A3.pcm
18 // RUN: %clang_cc1 -std=c++20 %t/TestA3.cpp -fprebuilt-module-path=%t -fsyntax-only -verify
20 //--- A.h
21 template <class _Tp>
22 concept A = requires(const _Tp& __t) { []<class __Up>(const __Up&) {}(__t); };
24 //--- A1.h
25 template <class _Tp>
26 concept A = requires(const _Tp& __t) { []<class __Up>(__Up) {}(__t); };
28 //--- A2.h
29 template <class _Tp>
30 concept A = requires(const _Tp& __t) { []<class __Up>(const __Up& __u) {
31     (int)__u;
32 }(__t); };
34 //--- A3.h
35 template <class _Tp>
36 concept A = requires(const _Tp& __t) { [t = '?']<class __Up>(const __Up&) {
37     (int)t;
38 }(__t); };
40 //--- A.cppm
41 module;
42 #include "A.h"
43 export module A;
44 export using ::A;
46 //--- A0.cppm
47 module;
48 #include "A.h"
49 export module A0;
50 export using ::A;
52 //--- TestA.cpp
53 // expected-no-diagnostics
54 import A;
55 import A0;
57 template <class C>
58 void f(C) requires(A<C>) {}
60 //--- A1.cppm
61 module;
62 #include "A1.h"
63 export module A1;
64 export using ::A;
66 //--- TestA1.cpp
67 import A;
68 import A1;
70 template <class C>
71 void f(C) requires(A<C>) {} // expected-error 1+{{reference to 'A' is ambiguous}}
72                             // expected-note@* 1+{{candidate found by name lookup is 'A'}}
74 //--- A2.cppm
75 module;
76 #include "A2.h"
77 export module A2;
78 export using ::A;
80 //--- TestA2.cpp
81 import A;
82 import A2;
84 template <class C>
85 void f(C) requires(A<C>) {} // expected-error 1+{{reference to 'A' is ambiguous}}
86                             // expected-note@* 1+{{candidate found by name lookup is 'A'}}
88 //--- A3.cppm
89 module;
90 #include "A3.h"
91 export module A3;
92 export using ::A;
94 //--- TestA3.cpp
95 import A;
96 import A3;
98 template <class C>
99 void f(C) requires(A<C>) {} // expected-error 1+{{reference to 'A' is ambiguous}}
100                             // expected-note@* 1+{{candidate found by name lookup is 'A'}}