[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / clang / test / CodeGenCXX / inalloca-lambda.cpp
blob5e653f0d293c8d2d4015ccac77462d75e2446a77
1 // RUN: %clang_cc1 -triple i686-windows-msvc -emit-llvm -o - %s 2>&1 | FileCheck %s
3 struct A {
4 A();
5 A(const A &);
6 int x;
7 };
8 void decayToFp(int (*f)(A));
9 void test() {
10 auto ld = [](A a) {
11 static int calls = 0;
12 ++calls;
13 return a.x + calls;
15 decayToFp(ld);
16 ld(A{});
19 // CHECK: define internal x86_thiscallcc noundef i32
20 // CHECK-SAME: @"??R<lambda_0>@?0??test@@YAXXZ@QBE?A?<auto>@@UA@@@Z"
21 // CHECK-SAME: (ptr noundef %this, ptr inalloca(<{ %struct.A }>) %[[ARG:.*]])
22 // CHECK: %[[V:.*]] = getelementptr inbounds <{ %struct.A }>, ptr %[[ARG]], i32 0, i32 0
23 // CHECK: %call = call x86_thiscallcc noundef i32
24 // CHECK-SAME: @"?__impl@<lambda_0>@?0??test@@YAXXZ@QBE?A?<auto>@@UA@@@Z"
25 // CHECK-SAME: (ptr noundef %this, ptr noundef %[[V]])
27 // CHECK: define internal noundef i32
28 // CHECK-SAME: @"?__invoke@<lambda_0>@?0??test@@YAXXZ@CA?A?<auto>@@UA@@@Z"
29 // CHECK-SAME: (ptr inalloca(<{ %struct.A }>) %[[ARG:.*]])
30 // CHECK: %unused.capture = alloca %class.anon, align 1
31 // CHECK: %[[VAR:.*]] = getelementptr inbounds <{ %struct.A }>, ptr %[[ARG]], i32 0, i32 0
32 // CHECK: %call = call x86_thiscallcc noundef i32
33 // CHECK-SAME: @"?__impl@<lambda_0>@?0??test@@YAXXZ@QBE?A?<auto>@@UA@@@Z"
34 // CHECK-SAME: (ptr noundef %unused.capture, ptr noundef %[[VAR]])
35 // CHECK: ret i32 %call
37 // CHECK: define internal x86_thiscallcc noundef i32
38 // CHECK-SAME: @"?__impl@<lambda_0>@?0??test@@YAXXZ@QBE?A?<auto>@@UA@@@Z"
39 // CHECK-SAME: (ptr noundef %this, ptr noundef %[[ARG:.*]])
40 // CHECK: %this.addr = alloca ptr, align 4
41 // CHECK: store ptr %this, ptr %this.addr, align 4
42 // CHECK: %this1 = load ptr, ptr %this.addr, align 4
43 // CHECK: %{{.*}} = load i32, ptr @"?calls@?1???R<lambda_0>
44 // CHECK: %inc = add nsw i32 %{{.*}}, 1
45 // CHECK: store i32 %inc, ptr @"?calls@?1???R<lambda_0>
46 // CHECK: %{{.*}} = getelementptr inbounds %struct.A, ptr %{{.*}}, i32 0, i32 0
47 // CHECK: %{{.*}} = load i32, ptr %{{.*}}, align 4
48 // CHECK: %{{.*}} = load i32, ptr @"?calls@?1???R<lambda_0>
49 // CHECK: %add = add nsw i32 %{{.*}}, %{{.*}}
50 // CHECK: ret i32 %add
52 // Make sure we don't try to copy an uncopyable type.
53 struct B {
54 B();
55 B(B &);
56 void operator=(B);
57 long long x;
58 } b;
60 void f() {
61 [](B) {}(b);