value-init.cpp revision bdc4d80956c83a486e58d3df6bb524a1f66ff574
1// RUN: %clang_cc1 %s -triple x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s 2 3struct A { 4 virtual ~A(); 5}; 6 7struct B : A { }; 8 9struct C { 10 int i; 11 B b; 12}; 13 14// CHECK: _Z15test_value_initv 15void test_value_init() { 16 // This value initialization requires zero initialization of the 'B' 17 // subobject followed by a call to its constructor. 18 // PR5800 19 20 // CHECK: store i32 17 21 // CHECK: call void @llvm.memset.p0i8.i64 22 // CHECK: call void @_ZN1BC1Ev 23 C c = { 17 } ; 24 // CHECK: call void @_ZN1CD1Ev 25} 26 27enum enum_type { negative_number = -1, magic_number = 42 }; 28 29class enum_holder 30{ 31 enum_type m_enum; 32 33public: 34 enum_holder() : m_enum(magic_number) { } 35}; 36 37struct enum_holder_and_int 38{ 39 enum_holder e; 40 int i; 41}; 42 43// CHECK: _Z24test_enum_holder_and_intv() 44void test_enum_holder_and_int() { 45 // CHECK: alloca 46 // CHECK-NEXT: bitcast 47 // CHECK-NEXT: call void @llvm.memset 48 // CHECK-NEXT: call void @_ZN19enum_holder_and_intC1Ev 49 enum_holder_and_int(); 50 // CHECK-NEXT: ret void 51} 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: define i32 @_ZN6ptrmem4testEPNS_1SE 78 int test(S *s) { 79 // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64 80 // CHECK: getelementptr 81 // CHECK: ret 82 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: define void @_ZN6PR98011fEv 103void f() { 104 // CHECK-NOT: call void @llvm.memset.p0i8.i64 105 // CHECK: call void @_ZN6PR98014TestC1Ei 106 // CHECK-NOT: call void @llvm.memset.p0i8.i64 107 // CHECK: call void @_ZN6PR98014TestC1Ev 108 Test partial[3] = { 1 }; 109 110 // CHECK-NOT: call void @llvm.memset.p0i8.i64 111 // CHECK: call void @_ZN6PR98014TestC1Ev 112 // CHECK-NOT: call void @_ZN6PR98014TestC1Ev 113 Test empty[3] = {}; 114 115 // CHECK: call void @llvm.memset.p0i8.i64 116 // CHECK-NOT: call void @llvm.memset.p0i8.i64 117 // CHECK: call void @_ZN6PR98015Test2C1Ev 118 // CHECK-NOT: call void @_ZN6PR98015Test2C1Ev 119 Test2 empty2[3] = {}; 120 121 // CHECK: call void @llvm.memset.p0i8.i64 122 // CHECK-NOT: call void @llvm.memset.p0i8.i64 123 // CHECK: call void @_ZN6PR98015Test3C1Ev 124 // CHECK-NOT: call void @llvm.memset.p0i8.i64 125 // CHECK-NOT: call void @_ZN6PR98015Test3C1Ev 126 Test3 empty3[3] = {}; 127} 128 129} 130 131namespace zeroinit { 132 struct S { int i; }; 133 134 // CHECK: define i32 @_ZN8zeroinit4testEv() 135 int test() { 136 // CHECK: call void @llvm.memset.p0i8.i64 137 // CHECK: getelementptr 138 // CHECK: ret i32 139 return S().i; 140 } 141 142 struct X0 { 143 X0() { } 144 int x; 145 }; 146 147 struct X1 : X0 { 148 int x1; 149 void f(); 150 }; 151 152 // CHECK: define void @_ZN8zeroinit9testX0_X1Ev 153 void testX0_X1() { 154 // CHECK: call void @llvm.memset.p0i8.i64 155 // CHECK-NEXT: call void @_ZN8zeroinit2X1C1Ev 156 // CHECK-NEXT: call void @_ZN8zeroinit2X11fEv 157 X1().f(); 158 } 159 160 template<typename> 161 struct X2 : X0 { 162 int x2; 163 void f(); 164 }; 165 166 template<typename> 167 struct X3 : X2<int> { 168 X3() : X2<int>() { } 169 int i; 170 }; 171 172 173 // CHECK: define void @_ZN8zeroinit9testX0_X3Ev 174 void testX0_X3() { 175 // CHECK-NOT: call void @llvm.memset 176 // CHECK: call void @_ZN8zeroinit2X3IiEC1Ev 177 // CHECK: call void @_ZN8zeroinit2X2IiE1fEv 178 // CHECK-NEXT: ret void 179 X3<int>().f(); 180 } 181 182 // More checks at EOF 183} 184 185namespace PR8726 { 186class C; 187struct S { 188 const C &c1; 189 int i; 190 const C &c2; 191}; 192void f(const C& c) { 193 S s = {c, 42, c}; 194} 195 196} 197 198// rdar://problem/9355931 199namespace test6 { 200 struct A { A(); A(int); }; 201 202 void test() { 203 A arr[10][20] = { 5 }; 204 }; 205 // CHECK: define void @_ZN5test64testEv() 206 // CHECK: [[ARR:%.*]] = alloca [10 x [20 x [[A:%.*]]]], 207 // CHECK-NEXT: [[IDX:%.*]] = alloca i64 208 209 // CHECK-NEXT: [[INNER:%.*]] = getelementptr inbounds [10 x [20 x [[A]]]]* [[ARR]], i64 0, i64 0 210 // CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [20 x [[A]]]* [[INNER]], i64 0, i64 0 211 // CHECK-NEXT: call void @_ZN5test61AC1Ei([[A]]* [[T0]], i32 5) 212 // CHECK-NEXT: [[BEGIN:%.*]] = getelementptr inbounds [[A]]* [[T0]], i64 1 213 // CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [[A]]* [[T0]], i64 20 214 // CHECK-NEXT: br label 215 // CHECK: [[CUR:%.*]] = phi [[A]]* [ [[BEGIN]], {{%.*}} ], [ [[NEXT:%.*]], {{%.*}} ] 216 // CHECK-NEXT: call void @_ZN5test61AC1Ev([[A]]* [[CUR]]) 217 // CHECK-NEXT: [[NEXT]] = getelementptr inbounds [[A]]* [[CUR]], i64 1 218 // CHECK-NEXT: [[T0:%.*]] = icmp eq [[A]]* [[NEXT]], [[END]] 219 // CHECK-NEXT: br i1 220 221 // CHECK: [[BEGIN:%.*]] = getelementptr inbounds [20 x [[A]]]* [[INNER]], i64 1 222 // CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [20 x [[A]]]* [[INNER]], i64 10 223 // CHECK-NEXT: br label 224 // CHECK: [[CUR:%.*]] = phi [20 x [[A]]]* [ [[BEGIN]], {{%.*}} ], [ [[NEXT:%.*]], {{%.*}} ] 225 // CHECK-NEXT: [[FIRST:%.*]] = bitcast [20 x [[A]]]* [[CUR]] to [[A]]* 226 227 // TODO: this loop should use phis, too, and for preference would be 228 // merged with the outer loop. 229 // CHECK-NEXT: store i64 0, i64* [[IDX]] 230 // CHECK-NEXT: br label 231 // CHECK: [[T0:%.*]] = load i64* [[IDX]] 232 // CHECK-NEXT: [[T1:%.*]] = icmp ult i64 [[T0]], 20 233 // CHECK-NEXT: br i1 [[T1]] 234 // CHECK: [[T0:%.*]] = load i64* [[IDX]] 235 // CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[A]]* [[FIRST]], i64 [[T0]] 236 // CHECK-NEXT: call void @_ZN5test61AC1Ev([[A]]* [[T1]]) 237 // CHECK-NEXT: br label 238 // CHECK: [[T0:%.*]] = load i64* [[IDX]] 239 // CHECK-NEXT: [[T1:%.*]] = add i64 [[T0]], 1 240 // CHECK-NEXT: store i64 [[T1]], i64* [[IDX]] 241 // CHECK-NEXT: br label 242 // CHECK: [[NEXT]] = getelementptr inbounds [20 x [[A]]]* [[CUR]], i64 1 243 // CHECK-NEXT: [[T0:%.*]] = icmp eq [20 x [[A]]]* [[NEXT]], [[END]] 244 // CHECK-NEXT: br i1 [[T0]] 245 // CHECK: ret void 246} 247 248// CHECK: define linkonce_odr void @_ZN8zeroinit2X3IiEC2Ev(%"struct.zeroinit::X3"* %this) unnamed_addr 249// CHECK: call void @llvm.memset.p0i8.i64 250// CHECK-NEXT: call void @_ZN8zeroinit2X2IiEC2Ev 251// CHECK-NEXT: ret void 252