diff options
Diffstat (limited to 'clang/test')
7 files changed, 82 insertions, 41 deletions
diff --git a/clang/test/CXX/special/class.copy/implicit-move-def.cpp b/clang/test/CXX/special/class.copy/implicit-move-def.cpp index f344b0cc6a0..7a6a1ee984e 100644 --- a/clang/test/CXX/special/class.copy/implicit-move-def.cpp +++ b/clang/test/CXX/special/class.copy/implicit-move-def.cpp @@ -110,8 +110,8 @@ void move_VirtualWithEmptyBase(VirtualWithEmptyBase &x, VirtualWithEmptyBase &y) // CHECK-CTOR: call {{.*}} @_ZN1FC1EOS_ // CHECK-CTOR: call {{.*}} @_ZN1EC1EOS_ // array loop -// CHECK-CTOR: br i1 // CHECK-CTOR: call {{.*}} @_ZN1FC1EOS_ +// CHECK-CTOR: br i1 // CHECK-CTOR: define linkonce_odr {{.*}} @_ZN1GC2EOS_ // CHECK-CTOR: call {{.*}} @_ZN1EC1EOS_ diff --git a/clang/test/CodeGenCXX/constructor-init.cpp b/clang/test/CodeGenCXX/constructor-init.cpp index c121755f649..fe15ccf8fef 100644 --- a/clang/test/CodeGenCXX/constructor-init.cpp +++ b/clang/test/CodeGenCXX/constructor-init.cpp @@ -207,20 +207,17 @@ namespace PR10720 { // CHECK-PR10720-LABEL: define linkonce_odr void @_ZN7PR107205pair2C2ERKS0_ // CHECK-PR10720-NOT: ret - // CHECK-PR10720: load - // CHECK-PR10720: icmp ult - // CHECK-PR10720-NEXT: br i1 // CHECK-PR10720: call void @_ZN7PR107201XC1ERKS0_ - // CHECK-PR10720-NEXT: br label + // CHECK-PR10720: icmp eq + // CHECK-PR10720-NEXT: br i1 // CHECK-PR10720: ret void // CHECK-PR10720-LABEL: define linkonce_odr void @_ZN7PR107205pair2C2EOS0_ // CHECK-PR10720-NOT: ret // CHECK-PR10720: load - // CHECK-PR10720: icmp ult - // CHECK-PR10720-NEXT: br i1 // CHECK-PR10720: call void @_ZN7PR107201XC1EOS0_ - // CHECK-PR10720-NEXT: br label + // CHECK-PR10720: icmp eq + // CHECK-PR10720-NEXT: br i1 // CHECK-PR10720: ret void pair2(pair2&&) = default; diff --git a/clang/test/CodeGenCXX/implicit-copy-constructor.cpp b/clang/test/CodeGenCXX/implicit-copy-constructor.cpp index d0224131c4d..3f8665aa3b4 100644 --- a/clang/test/CodeGenCXX/implicit-copy-constructor.cpp +++ b/clang/test/CodeGenCXX/implicit-copy-constructor.cpp @@ -48,12 +48,14 @@ void f(D d) { // CHECK: call void @_ZN1BC2ERS_ // CHECK: {{call void @llvm.memcpy.p0i8.p0i8.i64.*i64 28}} // CHECK: call void @_ZN1BC1ERS_ -// CHECK: br -// CHECK: {{icmp ult.*, 2}} -// CHECK: {{icmp ult.*, 3}} +// CHECK: br label // CHECK: call void @_ZN1AC1Ev // CHECK: call void @_ZN1CC1ERS_1A // CHECK: call void @_ZN1AD1Ev +// CHECK: {{icmp eq.*, 3}} +// CHECK: br i1 +// CHECK: {{icmp eq.*, 2}} +// CHECK: br i1 // CHECK: {{call void @llvm.memcpy.p0i8.p0i8.i64.*i64 300}} // CHECK: ret void diff --git a/clang/test/CodeGenCXX/lambda-expressions.cpp b/clang/test/CodeGenCXX/lambda-expressions.cpp index 2006f0f81ef..cefaeb4017b 100644 --- a/clang/test/CodeGenCXX/lambda-expressions.cpp +++ b/clang/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_ @@ -127,42 +129,66 @@ namespace pr28595 { ~A(); }; + void after_init() noexcept; + // CHECK-LABEL: define void @_ZN7pr285954testEv() void test() { - // CHECK: [[ARRAY:%.*]] = alloca [3 x [5 x [[A:%.*]]]], align 1 - // CHECK: [[DESTIDX:%.*]] = alloca i64, align 8 - // CHECK: [[I0:%.*]] = alloca i64, align 8 - // CHECK: [[I1:%.*]] = alloca i64, align 8 + // CHECK: %[[SRC:.*]] = alloca [3 x [5 x %[[A:.*]]]], align 1 A array[3][5]; - // CHECK: [[DESTBASE:%.*]] = bitcast [3 x [5 x [[A]]]]* {{.*}} to [[A]]* - // CHECK: store i64 0, i64* [[DESTIDX]], align 8 - // CHECK: store i64 0, i64* [[I0]], align 8 + // Skip over the initialization loop. + // CHECK: call {{.*}}after_init + after_init(); + + // CHECK: %[[DST_0:.*]] = getelementptr inbounds [3 x [5 x %[[A]]]], {{.*}}, i64 0, i64 0 // CHECK: br label - // CHECK: icmp ult - // CHECK: store i64 0, i64* [[I1]], align 8 + // 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: icmp ult - // CHECK: [[T0:%.*]] = load i64, i64* [[DESTIDX]], align 8 - // CHECK: [[DEST:%.*]] = getelementptr inbounds [[A]], [[A]]* [[DESTBASE]], i64 [[T0]] + // CHECK: %[[J:.*]] = phi i64 [ 0, %{{.*}} ], [ %[[J_NEXT:.*]], {{.*}} ] + // CHECK: %[[DST_I_J:.*]] = getelementptr {{.*}} %[[A]]* %[[DST_I_0]], i64 %[[J]] + // 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: br label %[[CLEANUP:.*]]{{$}} // CHECK: landingpad // CHECK: invoke void @_ZN7pr285954TempD1Ev - // CHECK: br label [[CLEANUP]] - // CHECK: icmp eq [[A]]* [[DESTBASE]], [[DEST]] - // CHECK: [[T0:%.*]] = phi [[A]]* - // CHECK: [[T1:%.*]] = getelementptr inbounds [[A]], [[A]]* [[T0]], i64 -1 - // CHECK: call void @_ZN7pr285951AD1Ev([[A]]* [[T1]]) - // CHECK: icmp eq [[A]]* [[T1]], [[DESTBASE]] + // CHECK: br label %[[CLEANUP]] + // + // FIXME: only emit a single cleanup loop here + // CHECK: [[CLEANUP]]: + // CHECK: icmp eq %[[A]]* %[[DST_I_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_I_0]] + // + // CHECK: %[[BEGIN:.*]] = getelementptr {{.*}} %[[DST_0]], i64 0, i64 0 + // CHECK: %[[END:.*]] = getelementptr {{.*}} %[[DST_I]], i64 0, i64 0 + // CHECK: icmp eq %[[A]]* %[[BEGIN]], %[[END]] + // CHECK: %[[T0:.*]] = phi %[[A]]* + // CHECK: %[[T1:.*]] = getelementptr inbounds %[[A]], %[[A]]* %[[T0]], i64 -1 + // CHECK: call void @_ZN7pr285951AD1Ev(%[[A]]* %[[T1]]) + // CHECK: icmp eq %[[A]]* %[[T1]], %[[BEGIN]] (void) [array]{}; - - // Skip over the initialization loop. - // CHECK: [[BEGIN:%.*]] = getelementptr inbounds [3 x [5 x [[A]]]], [3 x [5 x [[A]]]]* [[ARRAY]], i32 0, i32 0, i32 0 } } diff --git a/clang/test/CodeGenObjCXX/arc-special-member-functions.mm b/clang/test/CodeGenObjCXX/arc-special-member-functions.mm index df3c22916f5..af161ddc5ad 100644 --- a/clang/test/CodeGenObjCXX/arc-special-member-functions.mm +++ b/clang/test/CodeGenObjCXX/arc-special-member-functions.mm @@ -141,10 +141,9 @@ void test_ObjCBlockMember_copy_assign(ObjCBlockMember m1, ObjCBlockMember m2) { // Implicitly-generated copy constructor for ObjCArrayMember // CHECK-LABEL: define linkonce_odr void @_ZN15ObjCArrayMemberC2ERKS_ -// CHECK: br i1 // CHECK: call i8* @objc_retain // CHECK-NEXT: store i8* -// CHECK-NEXT: br label +// CHECK: br i1 // CHECK: ret // Implicitly-generated default constructor for ObjCBlockMember diff --git a/clang/test/CodeGenObjCXX/implicit-copy-constructor.mm b/clang/test/CodeGenObjCXX/implicit-copy-constructor.mm index 6c56616f04c..e1c7b8ded0e 100644 --- a/clang/test/CodeGenObjCXX/implicit-copy-constructor.mm +++ b/clang/test/CodeGenObjCXX/implicit-copy-constructor.mm @@ -49,12 +49,14 @@ void f(D d) { // CHECK: call void @_ZN1BC2ERS_ // CHECK: {{call void @llvm.memcpy.p0i8.p0i8.i64.*i64 24}} // CHECK: call void @_ZN1BC1ERS_ -// CHECK: br -// CHECK: {{icmp ult.*, 2}} -// CHECK: {{icmp ult.*, 3}} +// CHECK: br label // CHECK: call void @_ZN1AC1Ev // CHECK: call void @_ZN1CC1ERS_1A // CHECK: call void @_ZN1AD1Ev +// CHECK: {{icmp eq.*, 3}} +// CHECK: br i1 +// CHECK: {{icmp eq.*, 2}} +// CHECK: br i1 // CHECK: {{call.*@objc_memmove_collectable}} // CHECK: {{call void @llvm.memcpy.p0i8.p0i8.i64.*i64 12}} // CHECK: ret void diff --git a/clang/test/SemaCXX/constant-expression-cxx11.cpp b/clang/test/SemaCXX/constant-expression-cxx11.cpp index a441405939e..0b7528281ac 100644 --- a/clang/test/SemaCXX/constant-expression-cxx11.cpp +++ b/clang/test/SemaCXX/constant-expression-cxx11.cpp @@ -566,6 +566,21 @@ struct ArrayRVal { }; static_assert(ArrayRVal().elems[3].f() == 0, ""); +namespace CopyCtor { + struct A { + constexpr A() {} + constexpr A(const A &) {} + }; + struct B { + A a; + int arr[10]; + }; + constexpr B b{{}, {1, 2, 3, 4, 5}}; + constexpr B c = b; + static_assert(c.arr[2] == 3, ""); + static_assert(c.arr[7] == 0, ""); +} + constexpr int selfref[2][2][2] = { selfref[1][1][1] + 1, selfref[0][0][0] + 1, selfref[1][0][1] + 1, selfref[0][1][0] + 1, |