Home | History | Annotate | Download | only in CodeGenCXX
      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