1// RUN: %clang_cc1 -std=c++1y -triple x86_64-linux-gnu -emit-llvm %s -o - | FileCheck %s 2 3struct S { 4 S(); 5 S(S &&); 6 ~S(); 7}; 8 9void 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 22void 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 40int 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. 98auto global_lambda = [a = 0] () mutable { return ++a; }; 99int get_incremented() { return global_lambda(); } 100 101// CHECK-LABEL: define internal void @"_ZZ1fvEN3$_0D2Ev"( 102// CHECK: call void @_ZN1SD1Ev( 103