diff options
Diffstat (limited to 'test/CodeGenCXX/lambda-expressions.cpp')
-rw-r--r-- | test/CodeGenCXX/lambda-expressions.cpp | 78 |
1 files changed, 73 insertions, 5 deletions
diff --git a/test/CodeGenCXX/lambda-expressions.cpp b/test/CodeGenCXX/lambda-expressions.cpp index f59d360314e4b..2c625daaf831b 100644 --- a/test/CodeGenCXX/lambda-expressions.cpp +++ b/test/CodeGenCXX/lambda-expressions.cpp @@ -54,12 +54,14 @@ int c(int x) { return [&x]{return x;}(); } // CHECK: ret i32 struct D { D(); D(const D&); int x; }; -int d(int x) { D y[10]; [x,y] { return y[x].x; }(); } +int d(int x) { D y[10]; return [x,y] { return y[x].x; }(); } // CHECK-LABEL: define i32 @_Z1di // CHECK: call void @_ZN1DC1Ev -// CHECK: icmp ult i64 %{{.*}}, 10 +// CHECK: br label // CHECK: call void @_ZN1DC1ERKS_ +// CHECK: icmp eq i64 %{{.*}}, 10 +// CHECK: br i1 // CHECK: call i32 @"_ZZ1diENK3$_4clEv" // CHECK-LABEL: define internal i32 @"_ZZ1diENK3$_4clEv" // CHECK: load i32, i32* @@ -67,7 +69,7 @@ int d(int x) { D y[10]; [x,y] { return y[x].x; }(); } // CHECK: ret i32 struct E { E(); E(const E&); ~E(); int x; }; -int e(E a, E b, bool cond) { [a,b,cond](){ return (cond ? a : b).x; }(); } +int e(E a, E b, bool cond) { return [a,b,cond](){ return (cond ? a : b).x; }(); } // CHECK-LABEL: define i32 @_Z1e1ES_b // CHECK: call void @_ZN1EC1ERKS_ // CHECK: invoke void @_ZN1EC1ERKS_ @@ -116,6 +118,72 @@ int *PR22071_fun() { return [&] { return &y; }(); } +namespace pr28595 { + struct Temp { + Temp(); + ~Temp() noexcept(false); + }; + struct A { + A(); + A(const A &a, const Temp &temp = Temp()); + ~A(); + }; + + void after_init() noexcept; + + // CHECK-LABEL: define void @_ZN7pr285954testEv() + void test() { + // CHECK: %[[SRC:.*]] = alloca [3 x [5 x %[[A:.*]]]], align 1 + A array[3][5]; + + // Skip over the initialization loop. + // CHECK: call {{.*}}after_init + after_init(); + + // CHECK: %[[DST_0:.*]] = getelementptr {{.*}} [3 x [5 x %[[A]]]]* %[[DST:.*]], i64 0, i64 0 + // CHECK: br label + // CHECK: %[[I:.*]] = phi i64 [ 0, %{{.*}} ], [ %[[I_NEXT:.*]], {{.*}} ] + // CHECK: %[[DST_I:.*]] = getelementptr {{.*}} [5 x %[[A]]]* %[[DST_0]], i64 %[[I]] + // CHECK: %[[SRC_I:.*]] = getelementptr {{.*}} [3 x [5 x %[[A]]]]* %[[SRC]], i64 0, i64 %[[I]] + // + // CHECK: %[[DST_I_0:.*]] = getelementptr {{.*}} [5 x %[[A]]]* %[[DST_I]], i64 0, i64 0 + // CHECK: br label + // CHECK: %[[J:.*]] = phi i64 [ 0, %{{.*}} ], [ %[[J_NEXT:.*]], {{.*}} ] + // CHECK: %[[DST_I_J:.*]] = getelementptr {{.*}} %[[A]]* %[[DST_I_0]], i64 %[[J]] + // CHECK: %[[DST_0_0:.*]] = bitcast [5 x %[[A]]]* %[[DST_0]] to %[[A]]* + // CHECK: %[[SRC_I_J:.*]] = getelementptr {{.*}} [5 x %[[A]]]* %[[SRC_I]], i64 0, i64 %[[J]] + // + // CHECK: invoke void @_ZN7pr285954TempC1Ev + // CHECK: invoke void @_ZN7pr285951AC1ERKS0_RKNS_4TempE + // CHECK: invoke void @_ZN7pr285954TempD1Ev + // + // CHECK: add nuw i64 %[[J]], 1 + // CHECK: icmp eq + // CHECK: br i1 + // + // CHECK: add nuw i64 %[[I]], 1 + // CHECK: icmp eq + // CHECK: br i1 + // + // CHECK: ret void + // + // CHECK: landingpad + // CHECK: landingpad + // CHECK: br label %[[CLEANUP:.*]]{{$}} + // CHECK: landingpad + // CHECK: invoke void @_ZN7pr285954TempD1Ev + // CHECK: br label %[[CLEANUP]] + // + // CHECK: [[CLEANUP]]: + // CHECK: icmp eq %[[A]]* %[[DST_0_0]], %[[DST_I_J]] + // CHECK: %[[T0:.*]] = phi %[[A]]* + // CHECK: %[[T1:.*]] = getelementptr inbounds %[[A]], %[[A]]* %[[T0]], i64 -1 + // CHECK: call void @_ZN7pr285951AD1Ev(%[[A]]* %[[T1]]) + // CHECK: icmp eq %[[A]]* %[[T1]], %[[DST_0_0]] + (void) [array]{}; + } +} + // CHECK-LABEL: define internal void @"_ZZ1e1ES_bEN3$_5D2Ev" // CHECK-LABEL: define internal i32 @"_ZZ1fvEN3$_68__invokeEii" @@ -126,9 +194,9 @@ int *PR22071_fun() { // CHECK-NEXT: call i32 @"_ZZ1fvENK3$_6clEii" // CHECK-NEXT: ret i32 -// CHECK-LABEL: define internal void @"_ZZ1hvEN4$_108__invokeEv"(%struct.A* noalias sret %agg.result) {{.*}} { +// CHECK-LABEL: define internal void @"_ZZ1hvEN4$_118__invokeEv"(%struct.A* noalias sret %agg.result) {{.*}} { // CHECK-NOT: = -// CHECK: call void @"_ZZ1hvENK4$_10clEv"(%struct.A* sret %agg.result, +// CHECK: call void @"_ZZ1hvENK4$_11clEv"(%struct.A* sret %agg.result, // CHECK-NEXT: ret void struct A { ~A(); }; void h() { |