1 // RUN: %clang_cc1 -std=c++1y -triple x86_64-linux-gnu -emit-llvm %s -o - | FileCheck %s 2 3 struct S { 4 S(); 5 S(S &&); 6 ~S(); 7 }; 8 9 void f() { 10 (void) [s(S{})] {}; 11 } 12 13 // CHECK-LABEL: define void @_Z1fv( 14 // CHECK: call void @_ZN1SC1Ev( 15 // CHECK: call void @"_ZZ1fvEN3$_0D1Ev"( 16 17 // CHECK-LABEL: define internal void @"_ZZ1fvEN3$_0D1Ev"( 18 // CHECK: @"_ZZ1fvEN3$_0D2Ev"( 19 20 // D2 at end of file. 21 22 void g() { 23 [a(1), b(2)] { return a + b; } (); 24 } 25 26 // CHECK-LABEL: define void @_Z1gv( 27 // CHECK: getelementptr inbounds {{.*}}, i32 0, i32 0 28 // CHECK: store i32 1, i32* 29 // CHECK: getelementptr inbounds {{.*}}, i32 0, i32 1 30 // CHECK: store i32 2, i32* 31 // CHECK: call i32 @"_ZZ1gvENK3$_1clEv"( 32 33 // CHECK-LABEL: define internal i32 @"_ZZ1gvENK3$_1clEv"( 34 // CHECK: getelementptr inbounds {{.*}}, i32 0, i32 0 35 // CHECK: load i32* 36 // CHECK: getelementptr inbounds {{.*}}, i32 0, i32 1 37 // CHECK: load i32* 38 // CHECK: add nsw i32 39 40 int h(int a) { 41 // CHECK-LABEL: define i32 @_Z1hi( 42 // CHECK: %[[A_ADDR:.*]] = alloca i32, 43 // CHECK: %[[OUTER:.*]] = alloca 44 // CHECK: store i32 {{.*}}, i32* %[[A_ADDR]], 45 // 46 // Initialize init-capture 'b(a)' by reference. 47 // CHECK: getelementptr inbounds {{.*}}* %[[OUTER]], i32 0, i32 0 48 // CHECK: store i32* %[[A_ADDR]], i32** {{.*}}, 49 // 50 // Initialize init-capture 'c(a)' by copy. 51 // CHECK: getelementptr inbounds {{.*}}* %[[OUTER]], i32 0, i32 1 52 // CHECK: load i32* %[[A_ADDR]], 53 // CHECK: store i32 54 // 55 // CHECK: call i32 @"_ZZ1hiENK3$_2clEv"({{.*}}* %[[OUTER]]) 56 return [&b(a), c(a)] { 57 // CHECK-LABEL: define internal i32 @"_ZZ1hiENK3$_2clEv"( 58 // CHECK: %[[OUTER_ADDR:.*]] = alloca 59 // CHECK: %[[INNER:.*]] = alloca 60 // CHECK: store {{.*}}, {{.*}}** %[[OUTER_ADDR]], 61 // 62 // Capture outer 'c' by reference. 63 // CHECK: %[[OUTER:.*]] = load {{.*}}** %[[OUTER_ADDR]] 64 // CHECK: getelementptr inbounds {{.*}}* %[[INNER]], i32 0, i32 0 65 // CHECK-NEXT: getelementptr inbounds {{.*}}* %[[OUTER]], i32 0, i32 1 66 // CHECK-NEXT: store i32* % 67 // 68 // Capture outer 'b' by copy. 69 // CHECK: getelementptr inbounds {{.*}}* %[[INNER]], i32 0, i32 1 70 // CHECK-NEXT: getelementptr inbounds {{.*}}* %[[OUTER]], i32 0, i32 0 71 // CHECK-NEXT: load i32** % 72 // CHECK-NEXT: load i32* % 73 // CHECK-NEXT: store i32 74 // 75 // CHECK: call i32 @"_ZZZ1hiENK3$_2clEvENKUlvE_clEv"({{.*}}* %[[INNER]]) 76 return [=, &c] { 77 // CHECK-LABEL: define internal i32 @"_ZZZ1hiENK3$_2clEvENKUlvE_clEv"( 78 // CHECK: %[[INNER_ADDR:.*]] = alloca 79 // CHECK: store {{.*}}, {{.*}}** %[[INNER_ADDR]], 80 // CHECK: %[[INNER:.*]] = load {{.*}}** %[[INNER_ADDR]] 81 // 82 // Load capture of 'b' 83 // CHECK: getelementptr inbounds {{.*}}* %[[INNER]], i32 0, i32 1 84 // CHECK: load i32* % 85 // 86 // Load capture of 'c' 87 // CHECK: getelementptr inbounds {{.*}}* %[[INNER]], i32 0, i32 0 88 // CHECK: load i32** % 89 // CHECK: load i32* % 90 // 91 // CHECK: add nsw i32 92 return b + c; 93 } (); 94 } (); 95 } 96 97 // Ensure we can emit code for init-captures in global lambdas too. 98 auto global_lambda = [a = 0] () mutable { return ++a; }; 99 int get_incremented() { return global_lambda(); } 100 101 // CHECK-LABEL: define internal void @"_ZZ1fvEN3$_0D2Ev"( 102 // CHECK: call void @_ZN1SD1Ev( 103