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