116006c901315fa12a108b4e571f187f4b676e426Douglas Gregor// RUN: %clang_cc1 %s -triple x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s 216006c901315fa12a108b4e571f187f4b676e426Douglas Gregor 316006c901315fa12a108b4e571f187f4b676e426Douglas Gregorstruct A { 416006c901315fa12a108b4e571f187f4b676e426Douglas Gregor virtual ~A(); 516006c901315fa12a108b4e571f187f4b676e426Douglas Gregor}; 616006c901315fa12a108b4e571f187f4b676e426Douglas Gregor 716006c901315fa12a108b4e571f187f4b676e426Douglas Gregorstruct B : A { }; 816006c901315fa12a108b4e571f187f4b676e426Douglas Gregor 916006c901315fa12a108b4e571f187f4b676e426Douglas Gregorstruct C { 1016006c901315fa12a108b4e571f187f4b676e426Douglas Gregor int i; 1116006c901315fa12a108b4e571f187f4b676e426Douglas Gregor B b; 1216006c901315fa12a108b4e571f187f4b676e426Douglas Gregor}; 1316006c901315fa12a108b4e571f187f4b676e426Douglas Gregor 1416006c901315fa12a108b4e571f187f4b676e426Douglas Gregor// CHECK: _Z15test_value_initv 1516006c901315fa12a108b4e571f187f4b676e426Douglas Gregorvoid test_value_init() { 1616006c901315fa12a108b4e571f187f4b676e426Douglas Gregor // This value initialization requires zero initialization of the 'B' 1716006c901315fa12a108b4e571f187f4b676e426Douglas Gregor // subobject followed by a call to its constructor. 1816006c901315fa12a108b4e571f187f4b676e426Douglas Gregor // PR5800 1916006c901315fa12a108b4e571f187f4b676e426Douglas Gregor 2016006c901315fa12a108b4e571f187f4b676e426Douglas Gregor // CHECK: store i32 17 213ecd785aff34381f3704d9cb28fe3ef85af759deMon P Wang // CHECK: call void @llvm.memset.p0i8.i64 227dd4490e47a5348d3f5c6e05946f84666eceaec7Douglas Gregor // CHECK: call void @_ZN1BC1Ev 2316006c901315fa12a108b4e571f187f4b676e426Douglas Gregor C c = { 17 } ; 247dd4490e47a5348d3f5c6e05946f84666eceaec7Douglas Gregor // CHECK: call void @_ZN1CD1Ev 2516006c901315fa12a108b4e571f187f4b676e426Douglas Gregor} 261c63b9c15d48cb8c833a4b2d6fd6c496c0766e88Douglas Gregor 271c63b9c15d48cb8c833a4b2d6fd6c496c0766e88Douglas Gregorenum enum_type { negative_number = -1, magic_number = 42 }; 281c63b9c15d48cb8c833a4b2d6fd6c496c0766e88Douglas Gregor 291c63b9c15d48cb8c833a4b2d6fd6c496c0766e88Douglas Gregorclass enum_holder 301c63b9c15d48cb8c833a4b2d6fd6c496c0766e88Douglas Gregor{ 311c63b9c15d48cb8c833a4b2d6fd6c496c0766e88Douglas Gregor enum_type m_enum; 321c63b9c15d48cb8c833a4b2d6fd6c496c0766e88Douglas Gregor 331c63b9c15d48cb8c833a4b2d6fd6c496c0766e88Douglas Gregorpublic: 341c63b9c15d48cb8c833a4b2d6fd6c496c0766e88Douglas Gregor enum_holder() : m_enum(magic_number) { } 351c63b9c15d48cb8c833a4b2d6fd6c496c0766e88Douglas Gregor}; 361c63b9c15d48cb8c833a4b2d6fd6c496c0766e88Douglas Gregor 371c63b9c15d48cb8c833a4b2d6fd6c496c0766e88Douglas Gregorstruct enum_holder_and_int 381c63b9c15d48cb8c833a4b2d6fd6c496c0766e88Douglas Gregor{ 391c63b9c15d48cb8c833a4b2d6fd6c496c0766e88Douglas Gregor enum_holder e; 401c63b9c15d48cb8c833a4b2d6fd6c496c0766e88Douglas Gregor int i; 411c63b9c15d48cb8c833a4b2d6fd6c496c0766e88Douglas Gregor}; 421c63b9c15d48cb8c833a4b2d6fd6c496c0766e88Douglas Gregor 431c63b9c15d48cb8c833a4b2d6fd6c496c0766e88Douglas Gregor// CHECK: _Z24test_enum_holder_and_intv() 441c63b9c15d48cb8c833a4b2d6fd6c496c0766e88Douglas Gregorvoid test_enum_holder_and_int() { 451c63b9c15d48cb8c833a4b2d6fd6c496c0766e88Douglas Gregor // CHECK: alloca 461c63b9c15d48cb8c833a4b2d6fd6c496c0766e88Douglas Gregor // CHECK-NEXT: bitcast 471c63b9c15d48cb8c833a4b2d6fd6c496c0766e88Douglas Gregor // CHECK-NEXT: call void @llvm.memset 481c63b9c15d48cb8c833a4b2d6fd6c496c0766e88Douglas Gregor // CHECK-NEXT: call void @_ZN19enum_holder_and_intC1Ev 491c63b9c15d48cb8c833a4b2d6fd6c496c0766e88Douglas Gregor enum_holder_and_int(); 501c63b9c15d48cb8c833a4b2d6fd6c496c0766e88Douglas Gregor // CHECK-NEXT: ret void 511c63b9c15d48cb8c833a4b2d6fd6c496c0766e88Douglas Gregor} 529021718882441dd391a1960084580d3cd19c423aJohn McCall 539021718882441dd391a1960084580d3cd19c423aJohn McCall// PR7834: don't crash. 549021718882441dd391a1960084580d3cd19c423aJohn McCallnamespace test1 { 559021718882441dd391a1960084580d3cd19c423aJohn McCall struct A { 569021718882441dd391a1960084580d3cd19c423aJohn McCall int A::*f; 579021718882441dd391a1960084580d3cd19c423aJohn McCall A(); 589021718882441dd391a1960084580d3cd19c423aJohn McCall A(const A&); 599021718882441dd391a1960084580d3cd19c423aJohn McCall A &operator=(const A &); 609021718882441dd391a1960084580d3cd19c423aJohn McCall }; 619021718882441dd391a1960084580d3cd19c423aJohn McCall 629021718882441dd391a1960084580d3cd19c423aJohn McCall struct B { 639021718882441dd391a1960084580d3cd19c423aJohn McCall A base; 649021718882441dd391a1960084580d3cd19c423aJohn McCall }; 659021718882441dd391a1960084580d3cd19c423aJohn McCall 669021718882441dd391a1960084580d3cd19c423aJohn McCall void foo() { 679021718882441dd391a1960084580d3cd19c423aJohn McCall B(); 689021718882441dd391a1960084580d3cd19c423aJohn McCall } 699021718882441dd391a1960084580d3cd19c423aJohn McCall} 70452b7f22d75d1838df72653dcaacbf92b6c34e71Douglas Gregor 71452b7f22d75d1838df72653dcaacbf92b6c34e71Douglas Gregornamespace ptrmem { 72452b7f22d75d1838df72653dcaacbf92b6c34e71Douglas Gregor struct S { 73452b7f22d75d1838df72653dcaacbf92b6c34e71Douglas Gregor int mem1; 74452b7f22d75d1838df72653dcaacbf92b6c34e71Douglas Gregor int S::*mem2; 75452b7f22d75d1838df72653dcaacbf92b6c34e71Douglas Gregor }; 76452b7f22d75d1838df72653dcaacbf92b6c34e71Douglas Gregor 7793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define i32 @_ZN6ptrmem4testEPNS_1SE 78452b7f22d75d1838df72653dcaacbf92b6c34e71Douglas Gregor int test(S *s) { 79452b7f22d75d1838df72653dcaacbf92b6c34e71Douglas Gregor // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64 80452b7f22d75d1838df72653dcaacbf92b6c34e71Douglas Gregor // CHECK: getelementptr 81452b7f22d75d1838df72653dcaacbf92b6c34e71Douglas Gregor // CHECK: ret 82452b7f22d75d1838df72653dcaacbf92b6c34e71Douglas Gregor return s->*S().mem2; 83452b7f22d75d1838df72653dcaacbf92b6c34e71Douglas Gregor } 84452b7f22d75d1838df72653dcaacbf92b6c34e71Douglas Gregor} 85452b7f22d75d1838df72653dcaacbf92b6c34e71Douglas Gregor 863b4d490b09347e0b68ec0511ddfae79dfaba77a6Argyrios Kyrtzidisnamespace PR9801 { 873b4d490b09347e0b68ec0511ddfae79dfaba77a6Argyrios Kyrtzidis 883b4d490b09347e0b68ec0511ddfae79dfaba77a6Argyrios Kyrtzidisstruct Test { 893b4d490b09347e0b68ec0511ddfae79dfaba77a6Argyrios Kyrtzidis Test() : i(10) {} 903b4d490b09347e0b68ec0511ddfae79dfaba77a6Argyrios Kyrtzidis Test(int i) : i(i) {} 913b4d490b09347e0b68ec0511ddfae79dfaba77a6Argyrios Kyrtzidis int i; 923b4d490b09347e0b68ec0511ddfae79dfaba77a6Argyrios Kyrtzidisprivate: 933b4d490b09347e0b68ec0511ddfae79dfaba77a6Argyrios Kyrtzidis int j; 943b4d490b09347e0b68ec0511ddfae79dfaba77a6Argyrios Kyrtzidis}; 953b4d490b09347e0b68ec0511ddfae79dfaba77a6Argyrios Kyrtzidis 963b4d490b09347e0b68ec0511ddfae79dfaba77a6Argyrios Kyrtzidisstruct Test2 { 973b4d490b09347e0b68ec0511ddfae79dfaba77a6Argyrios Kyrtzidis Test t; 983b4d490b09347e0b68ec0511ddfae79dfaba77a6Argyrios Kyrtzidis}; 993b4d490b09347e0b68ec0511ddfae79dfaba77a6Argyrios Kyrtzidis 1003b4d490b09347e0b68ec0511ddfae79dfaba77a6Argyrios Kyrtzidisstruct Test3 : public Test { }; 1013b4d490b09347e0b68ec0511ddfae79dfaba77a6Argyrios Kyrtzidis 10293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_ZN6PR98011fEv 1033b4d490b09347e0b68ec0511ddfae79dfaba77a6Argyrios Kyrtzidisvoid f() { 104657baf19ca8a48a926bd3bc148b6ad1b17e53199Argyrios Kyrtzidis // CHECK-NOT: call void @llvm.memset.p0i8.i64 1053b4d490b09347e0b68ec0511ddfae79dfaba77a6Argyrios Kyrtzidis // CHECK: call void @_ZN6PR98014TestC1Ei 106657baf19ca8a48a926bd3bc148b6ad1b17e53199Argyrios Kyrtzidis // CHECK-NOT: call void @llvm.memset.p0i8.i64 1073b4d490b09347e0b68ec0511ddfae79dfaba77a6Argyrios Kyrtzidis // CHECK: call void @_ZN6PR98014TestC1Ev 1083b4d490b09347e0b68ec0511ddfae79dfaba77a6Argyrios Kyrtzidis Test partial[3] = { 1 }; 1093b4d490b09347e0b68ec0511ddfae79dfaba77a6Argyrios Kyrtzidis 110657baf19ca8a48a926bd3bc148b6ad1b17e53199Argyrios Kyrtzidis // CHECK-NOT: call void @llvm.memset.p0i8.i64 1113b4d490b09347e0b68ec0511ddfae79dfaba77a6Argyrios Kyrtzidis // CHECK: call void @_ZN6PR98014TestC1Ev 112bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall // CHECK-NOT: call void @_ZN6PR98014TestC1Ev 1133b4d490b09347e0b68ec0511ddfae79dfaba77a6Argyrios Kyrtzidis Test empty[3] = {}; 1143b4d490b09347e0b68ec0511ddfae79dfaba77a6Argyrios Kyrtzidis 115657baf19ca8a48a926bd3bc148b6ad1b17e53199Argyrios Kyrtzidis // CHECK: call void @llvm.memset.p0i8.i64 116657baf19ca8a48a926bd3bc148b6ad1b17e53199Argyrios Kyrtzidis // CHECK-NOT: call void @llvm.memset.p0i8.i64 1173b4d490b09347e0b68ec0511ddfae79dfaba77a6Argyrios Kyrtzidis // CHECK: call void @_ZN6PR98015Test2C1Ev 118bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall // CHECK-NOT: call void @_ZN6PR98015Test2C1Ev 1193b4d490b09347e0b68ec0511ddfae79dfaba77a6Argyrios Kyrtzidis Test2 empty2[3] = {}; 1203b4d490b09347e0b68ec0511ddfae79dfaba77a6Argyrios Kyrtzidis 121657baf19ca8a48a926bd3bc148b6ad1b17e53199Argyrios Kyrtzidis // CHECK: call void @llvm.memset.p0i8.i64 122657baf19ca8a48a926bd3bc148b6ad1b17e53199Argyrios Kyrtzidis // CHECK-NOT: call void @llvm.memset.p0i8.i64 1233b4d490b09347e0b68ec0511ddfae79dfaba77a6Argyrios Kyrtzidis // CHECK: call void @_ZN6PR98015Test3C1Ev 124657baf19ca8a48a926bd3bc148b6ad1b17e53199Argyrios Kyrtzidis // CHECK-NOT: call void @llvm.memset.p0i8.i64 125bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall // CHECK-NOT: call void @_ZN6PR98015Test3C1Ev 1263b4d490b09347e0b68ec0511ddfae79dfaba77a6Argyrios Kyrtzidis Test3 empty3[3] = {}; 1273b4d490b09347e0b68ec0511ddfae79dfaba77a6Argyrios Kyrtzidis} 1283b4d490b09347e0b68ec0511ddfae79dfaba77a6Argyrios Kyrtzidis 1293b4d490b09347e0b68ec0511ddfae79dfaba77a6Argyrios Kyrtzidis} 1303b4d490b09347e0b68ec0511ddfae79dfaba77a6Argyrios Kyrtzidis 131452b7f22d75d1838df72653dcaacbf92b6c34e71Douglas Gregornamespace zeroinit { 132452b7f22d75d1838df72653dcaacbf92b6c34e71Douglas Gregor struct S { int i; }; 133452b7f22d75d1838df72653dcaacbf92b6c34e71Douglas Gregor 13493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define i32 @_ZN8zeroinit4testEv() 135452b7f22d75d1838df72653dcaacbf92b6c34e71Douglas Gregor int test() { 136452b7f22d75d1838df72653dcaacbf92b6c34e71Douglas Gregor // CHECK: call void @llvm.memset.p0i8.i64 13751201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith // CHECK: ret i32 0 138452b7f22d75d1838df72653dcaacbf92b6c34e71Douglas Gregor return S().i; 139452b7f22d75d1838df72653dcaacbf92b6c34e71Douglas Gregor } 140759e41baf6a95c3a265970b6bf1c97c233fd28b0Douglas Gregor 141759e41baf6a95c3a265970b6bf1c97c233fd28b0Douglas Gregor struct X0 { 142759e41baf6a95c3a265970b6bf1c97c233fd28b0Douglas Gregor X0() { } 143759e41baf6a95c3a265970b6bf1c97c233fd28b0Douglas Gregor int x; 144759e41baf6a95c3a265970b6bf1c97c233fd28b0Douglas Gregor }; 145759e41baf6a95c3a265970b6bf1c97c233fd28b0Douglas Gregor 146759e41baf6a95c3a265970b6bf1c97c233fd28b0Douglas Gregor struct X1 : X0 { 147759e41baf6a95c3a265970b6bf1c97c233fd28b0Douglas Gregor int x1; 148759e41baf6a95c3a265970b6bf1c97c233fd28b0Douglas Gregor void f(); 149759e41baf6a95c3a265970b6bf1c97c233fd28b0Douglas Gregor }; 150759e41baf6a95c3a265970b6bf1c97c233fd28b0Douglas Gregor 15193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN8zeroinit9testX0_X1Ev 152759e41baf6a95c3a265970b6bf1c97c233fd28b0Douglas Gregor void testX0_X1() { 153759e41baf6a95c3a265970b6bf1c97c233fd28b0Douglas Gregor // CHECK: call void @llvm.memset.p0i8.i64 154759e41baf6a95c3a265970b6bf1c97c233fd28b0Douglas Gregor // CHECK-NEXT: call void @_ZN8zeroinit2X1C1Ev 155759e41baf6a95c3a265970b6bf1c97c233fd28b0Douglas Gregor // CHECK-NEXT: call void @_ZN8zeroinit2X11fEv 156759e41baf6a95c3a265970b6bf1c97c233fd28b0Douglas Gregor X1().f(); 157759e41baf6a95c3a265970b6bf1c97c233fd28b0Douglas Gregor } 1588c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor 1598c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor template<typename> 1608c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor struct X2 : X0 { 1618c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor int x2; 1628c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor void f(); 1638c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor }; 1648c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor 1658c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor template<typename> 1668c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor struct X3 : X2<int> { 1678c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor X3() : X2<int>() { } 1681741d7b3c88eda8891d30f5c920d55dfd54c62f0Anders Carlsson int i; 1698c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor }; 1708c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor 1718c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor 17293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN8zeroinit9testX0_X3Ev 1738c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor void testX0_X3() { 1748c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor // CHECK-NOT: call void @llvm.memset 1758c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor // CHECK: call void @_ZN8zeroinit2X3IiEC1Ev 1768c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor // CHECK: call void @_ZN8zeroinit2X2IiE1fEv 1778c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor // CHECK-NEXT: ret void 1788c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor X3<int>().f(); 1798c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor } 1808c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor 181bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall // More checks at EOF 182452b7f22d75d1838df72653dcaacbf92b6c34e71Douglas Gregor} 183d1d56df188e25c633f9bc65d229897b42442b0f7Chris Lattner 184d1d56df188e25c633f9bc65d229897b42442b0f7Chris Lattnernamespace PR8726 { 185d1d56df188e25c633f9bc65d229897b42442b0f7Chris Lattnerclass C; 186d1d56df188e25c633f9bc65d229897b42442b0f7Chris Lattnerstruct S { 187d1d56df188e25c633f9bc65d229897b42442b0f7Chris Lattner const C &c1; 188d1d56df188e25c633f9bc65d229897b42442b0f7Chris Lattner int i; 189d1d56df188e25c633f9bc65d229897b42442b0f7Chris Lattner const C &c2; 190d1d56df188e25c633f9bc65d229897b42442b0f7Chris Lattner}; 191d1d56df188e25c633f9bc65d229897b42442b0f7Chris Lattnervoid f(const C& c) { 192d1d56df188e25c633f9bc65d229897b42442b0f7Chris Lattner S s = {c, 42, c}; 193d1d56df188e25c633f9bc65d229897b42442b0f7Chris Lattner} 194d1d56df188e25c633f9bc65d229897b42442b0f7Chris Lattner 195124b3def9ed99dc844225aeb6b17f789307500eeChris Lattner} 196bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall 197bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall// rdar://problem/9355931 198bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCallnamespace test6 { 199bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall struct A { A(); A(int); }; 200bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall 201bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall void test() { 202bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall A arr[10][20] = { 5 }; 203bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall }; 20493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN5test64testEv() 205bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall // CHECK: [[ARR:%.*]] = alloca [10 x [20 x [[A:%.*]]]], 206bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall 2073ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: [[INNER:%.*]] = getelementptr inbounds [10 x [20 x [[A]]]], [10 x [20 x [[A]]]]* [[ARR]], i64 0, i64 0 2083ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [20 x [[A]]], [20 x [[A]]]* [[INNER]], i64 0, i64 0 209bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall // CHECK-NEXT: call void @_ZN5test61AC1Ei([[A]]* [[T0]], i32 5) 2103ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: [[BEGIN:%.*]] = getelementptr inbounds [[A]], [[A]]* [[T0]], i64 1 2113ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [[A]], [[A]]* [[T0]], i64 20 212bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall // CHECK-NEXT: br label 213bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall // CHECK: [[CUR:%.*]] = phi [[A]]* [ [[BEGIN]], {{%.*}} ], [ [[NEXT:%.*]], {{%.*}} ] 214bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall // CHECK-NEXT: call void @_ZN5test61AC1Ev([[A]]* [[CUR]]) 2153ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: [[NEXT]] = getelementptr inbounds [[A]], [[A]]* [[CUR]], i64 1 216bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall // CHECK-NEXT: [[T0:%.*]] = icmp eq [[A]]* [[NEXT]], [[END]] 217bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall // CHECK-NEXT: br i1 218bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall 2193ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: [[BEGIN:%.*]] = getelementptr inbounds [20 x [[A]]], [20 x [[A]]]* [[INNER]], i64 1 2203ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [20 x [[A]]], [20 x [[A]]]* [[INNER]], i64 10 221bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall // CHECK-NEXT: br label 222bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall // CHECK: [[CUR:%.*]] = phi [20 x [[A]]]* [ [[BEGIN]], {{%.*}} ], [ [[NEXT:%.*]], {{%.*}} ] 223bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall 224c3c0766277cd64bf117450a1519c9cf762d994d4John McCall // Inner loop. 2253ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: [[IBEGIN:%.*]] = getelementptr inbounds [20 x [[A]]], [20 x [[A]]]* [[CUR]], i32 0, i32 0 2263ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: [[IEND:%.*]] = getelementptr inbounds [[A]], [[A]]* [[IBEGIN]], i64 20 227bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall // CHECK-NEXT: br label 228c3c0766277cd64bf117450a1519c9cf762d994d4John McCall // CHECK: [[ICUR:%.*]] = phi [[A]]* [ [[IBEGIN]], {{%.*}} ], [ [[INEXT:%.*]], {{%.*}} ] 229c3c0766277cd64bf117450a1519c9cf762d994d4John McCall // CHECK-NEXT: call void @_ZN5test61AC1Ev([[A]]* [[ICUR]]) 2303ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: [[INEXT:%.*]] = getelementptr inbounds [[A]], [[A]]* [[ICUR]], i64 1 231c3c0766277cd64bf117450a1519c9cf762d994d4John McCall // CHECK-NEXT: [[T0:%.*]] = icmp eq [[A]]* [[INEXT]], [[IEND]] 232c3c0766277cd64bf117450a1519c9cf762d994d4John McCall // CHECK-NEXT: br i1 [[T0]], 233c3c0766277cd64bf117450a1519c9cf762d994d4John McCall 2343ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: [[NEXT]] = getelementptr inbounds [20 x [[A]]], [20 x [[A]]]* [[CUR]], i64 1 235bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall // CHECK-NEXT: [[T0:%.*]] = icmp eq [20 x [[A]]]* [[NEXT]], [[END]] 236bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall // CHECK-NEXT: br i1 [[T0]] 237bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall // CHECK: ret void 238bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall} 239bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall 2402ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedmannamespace PR11124 { 2412ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman // Make sure C::C doesn't overwrite parts of A while it is zero-initializing B 2422ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman struct A { int a; A(); A(int); }; 2432ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman struct B : virtual A { int b; }; 2442ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman struct C : B { C(); }; 2452ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman C::C() : A(3), B() {} 24693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN7PR111241CC1Ev 2472ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman // CHECK: call void @llvm.memset.p0i8.i64(i8* {{.*}}, i8 0, i64 12, i32 8, i1 false) 2482ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman // CHECK-NEXT: call void @_ZN7PR111241BC2Ev 2492ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman // Make sure C::C doesn't overwrite parts of A while it is zero-initializing B 2502ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman 2512ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman struct B2 : virtual A { int B::*b; }; 2522ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman struct C2 : B2 { C2(); }; 2532ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman C2::C2() : A(3), B2() {} 25493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN7PR111242C2C1Ev 2552ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* %{{.*}}, i8* {{.*}}, i64 16, i32 8, i1 false) 2562ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman // CHECK-NEXT: call void @_ZN7PR111242B2C2Ev 2572ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman} 2582ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman 2590dbe2fb7758fe64568206b5bc0f1c5b106b9c806Richard Smith// Ensure we produce an i1 here, and don't assert. 26093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z9r170806_bv( 2610dbe2fb7758fe64568206b5bc0f1c5b106b9c806Richard Smith// CHECK: call void @_Z9r170806_ab(i1 zeroext false) 2620dbe2fb7758fe64568206b5bc0f1c5b106b9c806Richard Smithvoid r170806_a(bool b = bool()); 2630dbe2fb7758fe64568206b5bc0f1c5b106b9c806Richard Smithvoid r170806_b() { r170806_a(); } 2640dbe2fb7758fe64568206b5bc0f1c5b106b9c806Richard Smith 265176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace PR20256 { 266176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines struct data { int i; }; 267176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 268176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines template<typename T = int> 269176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines data g() { 270176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines data d; // not value-init 271176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return d; 272176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 273176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines template data g(); 274176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK-LABEL: define {{.*}} @_ZN7PR202561gIiEENS_4dataEv( 275176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK-NOT: store 276176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK-NOT: memset 277176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK: } 278176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 279176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines template<typename ...T> 280176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines data h(T ...t) { 281176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines data d(t...); // value-init 282176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return d; 283176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 284176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines template data h(); 285176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK-LABEL: define {{.*}} @_ZN7PR202561hIJEEENS_4dataEDpT_( 286176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK: call void @llvm.memset 287176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK: } 288176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 289176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 290176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines template<typename T = int> 291176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines data j() { 292176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines data d = {}; // value-init 293176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return d; 294176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 295176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines template data j(); 296176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK-LABEL: define {{.*}} @_ZN7PR202561jIiEENS_4dataEv( 297176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK: call void @llvm.memset 298176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK: } 299176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 300176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines data f() { 301176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines data d; // not value-init 302176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return d; 303176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 304176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK-LABEL: define {{.*}} @_ZN7PR202561fEv( 305176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK-NOT: store 306176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK-NOT: memset 307176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK: } 308176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 309176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines data i() { 310176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines data d = {}; // value-init 311176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return d; 312176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 313176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK-LABEL: define {{.*}} @_ZN7PR202561iEv( 314176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK: call void @llvm.memset 315176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK: } 316176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 317176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 31893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define linkonce_odr void @_ZN8zeroinit2X3IiEC2Ev(%"struct.zeroinit::X3"* %this) unnamed_addr 319bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall// CHECK: call void @llvm.memset.p0i8.i64 320bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall// CHECK-NEXT: call void @_ZN8zeroinit2X2IiEC2Ev 321bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall// CHECK-NEXT: ret void 322