341 lines · cpp
1// RUN: %clang_cc1 -std=c++98 %s -triple x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-CXX982// RUN: %clang_cc1 -std=c++17 %s -triple x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-CXX173 4struct A {5 virtual ~A();6};7 8struct B : A { };9 10struct C {11 int i;12 B b;13};14 15// CHECK: _Z15test_value_initv16void test_value_init() {17 // This value initialization requires zero initialization of the 'B'18 // subobject followed by a call to its constructor.19 // PR580020 21 // CHECK: store i32 1722 // CHECK: call void @llvm.memset.p0.i6423 // CHECK: call void @_ZN1BC1Ev24 C c = { 17 } ;25 // CHECK: call void @_ZN1CD1Ev26}27 28enum enum_type { negative_number = -1, magic_number = 42 };29 30class enum_holder31{32 enum_type m_enum;33 34public:35 enum_holder() : m_enum(magic_number) { }36};37 38struct enum_holder_and_int39{40 enum_holder e;41 int i;42};43 44// CHECK: _Z24test_enum_holder_and_intv()45void test_enum_holder_and_int() {46 // CHECK: alloca47 // CHECK-NEXT: call void @llvm.memset48 // CHECK-NEXT: call void @_ZN19enum_holder_and_intC1Ev49 enum_holder_and_int();50 // CHECK-NEXT: ret void51}52 53// PR7834: don't crash.54namespace test1 {55 struct A {56 int A::*f;57 A();58 A(const A&);59 A &operator=(const A &);60 };61 62 struct B {63 A base;64 };65 66 void foo() {67 B();68 }69}70 71namespace ptrmem {72 struct S {73 int mem1;74 int S::*mem2;75 };76 77 // CHECK-LABEL: define{{.*}} i32 @_ZN6ptrmem4testEPNS_1SE78 int test(S *s) {79 // CHECK: call void @llvm.memcpy.p0.p0.i6480 // CHECK: getelementptr81 // CHECK: ret82 return s->*S().mem2;83 }84}85 86namespace PR9801 {87 88struct Test {89 Test() : i(10) {}90 Test(int i) : i(i) {}91 int i;92private:93 int j;94};95 96struct Test2 {97 Test t;98};99 100struct Test3 : public Test { };101 102// CHECK-LABEL: define{{.*}} void @_ZN6PR98011fEv103void f() {104 // CHECK-NOT: call void @llvm.memset.p0.i64105 // CHECK: call void @_ZN6PR98014TestC1Ei106 // CHECK-NOT: call void @llvm.memset.p0.i64107 // CHECK: call void @_ZN6PR98014TestC1Ev108 Test partial[3] = { 1 };109 110 // CHECK-NOT: call void @llvm.memset.p0.i64111 // CHECK: call void @_ZN6PR98014TestC1Ev112 // CHECK-NOT: call void @_ZN6PR98014TestC1Ev113 Test empty[3] = {};114 115 // CHECK: call void @llvm.memset.p0.i64116 // CHECK-NOT: call void @llvm.memset.p0.i64117 // CHECK-CXX98: call void @_ZN6PR98015Test2C1Ev118 // CHECK-CXX17: call void @_ZN6PR98014TestC1Ev119 // CHECK-NOT: call void @_ZN6PR98015Test2C1Ev120 Test2 empty2[3] = {};121 122 // CHECK: call void @llvm.memset.p0.i64123 // CHECK-NOT: call void @llvm.memset.p0.i64124 // CHECK-CXX98: call void @_ZN6PR98015Test3C1Ev125 // CHECK-CXX17: call void @_ZN6PR98014TestC2Ev126 // CHECK-NOT: call void @llvm.memset.p0.i64127 // CHECK-NOT: call void @_ZN6PR98015Test3C1Ev128 Test3 empty3[3] = {};129}130 131}132 133namespace zeroinit {134 struct S { int i; };135 136 // CHECK-LABEL: define{{.*}} i32 @_ZN8zeroinit4testEv()137 int test() {138 // CHECK: call void @llvm.memset.p0.i64139 // CHECK: ret i32 0140 return S().i;141 }142 143 struct X0 {144 X0() { }145 int x;146 };147 148 struct X1 : X0 {149 int x1;150 void f();151 };152 153 // CHECK-LABEL: define{{.*}} void @_ZN8zeroinit9testX0_X1Ev154 void testX0_X1() {155 // CHECK: call void @llvm.memset.p0.i64156 // CHECK-NEXT: call void @_ZN8zeroinit2X1C1Ev157 // CHECK-NEXT: call void @_ZN8zeroinit2X11fEv158 X1().f();159 }160 161 template<typename>162 struct X2 : X0 {163 int x2;164 void f();165 };166 167 template<typename>168 struct X3 : X2<int> { 169 X3() : X2<int>() { }170 int i;171 };172 173 174 // CHECK-LABEL: define{{.*}} void @_ZN8zeroinit9testX0_X3Ev175 void testX0_X3() {176 // CHECK-NOT: call void @llvm.memset177 // CHECK: call void @_ZN8zeroinit2X3IiEC1Ev178 // CHECK: call void @_ZN8zeroinit2X2IiE1fEv179 // CHECK-NEXT: ret void180 X3<int>().f();181 }182 183 // More checks at EOF184}185 186namespace PR8726 {187class C;188struct S {189 const C &c1;190 int i;191 const C &c2;192};193void f(const C& c) {194 S s = {c, 42, c};195}196 197}198 199namespace test6 {200 struct A { A(); A(int); };201 202 void test() {203 A arr[10][20] = { 5 };204 };205 // CHECK-LABEL: define{{.*}} void @_ZN5test64testEv()206 // CHECK: [[ARR:%.*]] = alloca [10 x [20 x [[A:%.*]]]],207 208 // CHECK-NEXT: call void @_ZN5test61AC1Ei(ptr {{[^,]*}} [[ARR]], i32 noundef 5)209 // CHECK-NEXT: [[BEGIN:%.*]] = getelementptr inbounds [[A]], ptr [[ARR]], i64 1210 // CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [[A]], ptr [[ARR]], i64 20211 // CHECK-NEXT: br label212 // CHECK: [[CUR:%.*]] = phi ptr [ [[BEGIN]], {{%.*}} ], [ [[NEXT:%.*]], {{%.*}} ]213 // CHECK-NEXT: call void @_ZN5test61AC1Ev(ptr {{[^,]*}} [[CUR]])214 // CHECK-NEXT: [[NEXT]] = getelementptr inbounds [[A]], ptr [[CUR]], i64 1215 // CHECK-NEXT: [[T0:%.*]] = icmp eq ptr [[NEXT]], [[END]]216 // CHECK-NEXT: br i1217 218 // CHECK: [[BEGIN:%.*]] = getelementptr inbounds [20 x [[A]]], ptr [[ARR]], i64 1219 // CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [20 x [[A]]], ptr [[ARR]], i64 10220 // CHECK-NEXT: br label221 // Inner loop.222 // CHECK-CXX98: [[CUR:%.*]] = phi ptr [ [[BEGIN]], {{%.*}} ], [ [[NEXT:%.*]], {{%.*}} ]223 224 // CHECK-CXX98: [[IBEGIN:%.*]] = getelementptr inbounds [20 x [[A]]], ptr [[CUR]], i{{32|64}} 0, i{{32|64}} 0225 // CHECK-CXX17: [[IBEGIN:%.*]] = phi ptr [ [[BEGIN]], {{%.*}} ], [ [[NEXT:%.*]], {{%.*}} ]226 227 // CHECK-NEXT: [[IEND:%.*]] = getelementptr inbounds [[A]], ptr [[IBEGIN]], i64 20228 // CHECK-NEXT: br label229 // CHECK: [[ICUR:%.*]] = phi ptr [ [[IBEGIN]], {{%.*}} ], [ [[INEXT:%.*]], {{%.*}} ]230 // CHECK-NEXT: call void @_ZN5test61AC1Ev(ptr {{[^,]*}} [[ICUR]])231 // CHECK-NEXT: [[INEXT:%.*]] = getelementptr inbounds [[A]], ptr [[ICUR]], i64 1232 // CHECK-NEXT: [[T0:%.*]] = icmp eq ptr [[INEXT]], [[IEND]]233 // CHECK-NEXT: br i1 [[T0]],234 235 // CHECK-CXX98: [[NEXT]] = getelementptr inbounds [20 x [[A]]], ptr [[CUR]], i64 1236 // CHECK-CXX17: [[NEXT]] = getelementptr inbounds [20 x [[A]]], ptr [[IBEGIN]], i64 1237 // CHECK-NEXT: [[T0:%.*]] = icmp eq ptr [[NEXT]], [[END]]238 // CHECK-NEXT: br i1 [[T0]]239 // CHECK: ret void240}241 242namespace PR11124 {243 // Make sure C::C doesn't overwrite parts of A while it is zero-initializing B244 struct A { int a; A(); A(int); };245 struct B : virtual A { int b; };246 struct C : B { C(); }; 247 C::C() : A(3), B() {}248 // CHECK-LABEL: define{{.*}} void @_ZN7PR111241CC1Ev249 // CHECK: call void @llvm.memset.p0.i64(ptr align 8 {{.*}}, i8 0, i64 12, i1 false)250 // CHECK-NEXT: call void @_ZN7PR111241BC2Ev251 // Make sure C::C doesn't overwrite parts of A while it is zero-initializing B252 253 struct B2 : virtual A { int B::*b; };254 struct C2 : B2 { C2(); }; 255 C2::C2() : A(3), B2() {}256 // CHECK-LABEL: define{{.*}} void @_ZN7PR111242C2C1Ev257 // CHECK: call void @llvm.memcpy.p0.p0.i64(ptr align 8 %{{.*}}, ptr align 8 {{.*}}, i64 16, i1 false)258 // CHECK-NEXT: call void @_ZN7PR111242B2C2Ev259}260 261// Ensure we produce an i1 here, and don't assert.262// CHECK-LABEL: define{{.*}} void @_Z9r170806_bv(263// CHECK: call void @_Z9r170806_ab(i1 noundef zeroext false)264void r170806_a(bool b = bool());265void r170806_b() { r170806_a(); }266 267namespace PR20256 {268 struct data { int i; };269 270 template<typename T = int>271 data g() {272 data d; // not value-init273 return d;274 }275 template data g();276 // CHECK-LABEL: define {{.*}} @_ZN7PR202561gIiEENS_4dataEv(277 // CHECK-NOT: store278 // CHECK-NOT: memset279 // CHECK: }280 281 template<typename ...T>282 data h(T ...t) {283 data d(t...); // value-init284 return d;285 }286 template data h();287 // CHECK-LABEL: define {{.*}} @_ZN7PR202561hIJEEENS_4dataEDpT_(288 // CHECK: call void @llvm.memset289 // CHECK: }290 291 292 template<typename T = int>293 data j() {294 data d = {}; // value-init295 return d;296 }297 template data j();298 // CHECK-LABEL: define {{.*}} @_ZN7PR202561jIiEENS_4dataEv(299 // CHECK: call void @llvm.memset300 // CHECK: }301 302 data f() {303 data d; // not value-init304 return d;305 }306 // CHECK-LABEL: define {{.*}} @_ZN7PR202561fEv(307 // CHECK-NOT: store308 // CHECK-NOT: memset309 // CHECK: }310 311 data i() {312 data d = {}; // value-init313 return d;314 }315 // CHECK-LABEL: define {{.*}} @_ZN7PR202561iEv(316 // CHECK: call void @llvm.memset317 // CHECK: }318}319 320// CHECK-LABEL: define {{.*}}@_Z20explicitly_defaultedv321int explicitly_defaulted() {322 struct A { A() = default; int n; };323 // CHECK: call void @llvm.memset324 A a = A();325 return a.n;326} // CHECK-LABEL: }327 328// CHECK-LABEL: define linkonce_odr void @_ZN8zeroinit2X3IiEC2Ev(ptr {{[^,]*}} %this) unnamed_addr329// CHECK: call void @llvm.memset.p0.i64330// CHECK-NEXT: call void @_ZN8zeroinit2X2IiEC2Ev331// CHECK-NEXT: ret void332 333#if __cplusplus >= 201103L334namespace transparent_init_list {335 struct optional_assign_base {};336 struct optional_data_dtor_base { char dummy_[24]; };337 struct optional : optional_data_dtor_base, optional_assign_base {};338 optional f(optional a) { return {optional(a)}; }339}340#endif341