xref: /llvm-project/clang/test/Modules/lambda-merge.cpp (revision 4a1ccfe8a3cfd4569bc962a38b6117a9a2b8ad21)
1*4a1ccfe8SRichard Smith // RUN: %clang_cc1 -fmodules -std=c++17 -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s
2*4a1ccfe8SRichard Smith 
3*4a1ccfe8SRichard Smith #pragma clang module build A
4*4a1ccfe8SRichard Smith module A {}
5*4a1ccfe8SRichard Smith #pragma clang module contents
6*4a1ccfe8SRichard Smith #pragma clang module begin A
7*4a1ccfe8SRichard Smith template<typename T> T f(T v) {
8*4a1ccfe8SRichard Smith   v();
9*4a1ccfe8SRichard Smith   return v;
10*4a1ccfe8SRichard Smith }
11*4a1ccfe8SRichard Smith inline auto g() {
12*4a1ccfe8SRichard Smith   int n = 0;
__anone4e5d8fc0102null13*4a1ccfe8SRichard Smith   return f([=] { return n; });
14*4a1ccfe8SRichard Smith }
15*4a1ccfe8SRichard Smith 
16*4a1ccfe8SRichard Smith template<typename T> constexpr T f2(T v) {
17*4a1ccfe8SRichard Smith   v();
18*4a1ccfe8SRichard Smith   return v;
19*4a1ccfe8SRichard Smith }
20*4a1ccfe8SRichard Smith constexpr auto g2() {
21*4a1ccfe8SRichard Smith   int n = 0;
__anone4e5d8fc0202null22*4a1ccfe8SRichard Smith   return f2([=] { return n; });
23*4a1ccfe8SRichard Smith }
24*4a1ccfe8SRichard Smith #pragma clang module end
25*4a1ccfe8SRichard Smith #pragma clang module endbuild
26*4a1ccfe8SRichard Smith 
27*4a1ccfe8SRichard Smith #pragma clang module build B
28*4a1ccfe8SRichard Smith module B {}
29*4a1ccfe8SRichard Smith #pragma clang module contents
30*4a1ccfe8SRichard Smith #pragma clang module begin B
31*4a1ccfe8SRichard Smith template<typename T> T f(T v) {
32*4a1ccfe8SRichard Smith   v();
33*4a1ccfe8SRichard Smith   return v;
34*4a1ccfe8SRichard Smith }
35*4a1ccfe8SRichard Smith inline auto g() {
36*4a1ccfe8SRichard Smith   int n = 0;
__anone4e5d8fc0302null37*4a1ccfe8SRichard Smith   return f([=] { return n; });
38*4a1ccfe8SRichard Smith }
39*4a1ccfe8SRichard Smith 
40*4a1ccfe8SRichard Smith template<typename T> constexpr T f2(T v) {
41*4a1ccfe8SRichard Smith   v();
42*4a1ccfe8SRichard Smith   return v;
43*4a1ccfe8SRichard Smith }
44*4a1ccfe8SRichard Smith constexpr auto g2() {
45*4a1ccfe8SRichard Smith   int n = 0;
__anone4e5d8fc0402null46*4a1ccfe8SRichard Smith   return f2([=] { return n; });
47*4a1ccfe8SRichard Smith }
48*4a1ccfe8SRichard Smith #pragma clang module end
49*4a1ccfe8SRichard Smith #pragma clang module endbuild
50*4a1ccfe8SRichard Smith 
51*4a1ccfe8SRichard Smith #pragma clang module import A
52*4a1ccfe8SRichard Smith #pragma clang module import B
53*4a1ccfe8SRichard Smith 
54*4a1ccfe8SRichard Smith // CHECK: define {{.*}}use_g
55*4a1ccfe8SRichard Smith int use_g() {
56*4a1ccfe8SRichard Smith   return g()();
57*4a1ccfe8SRichard Smith }
58*4a1ccfe8SRichard Smith 
59*4a1ccfe8SRichard Smith static_assert(g2()() == 0);
60