1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -Wreorder -fsyntax-only -verify %s
27ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregorclass A {
37ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor  int m;
47002f4c03c2d0544f4e8bea8d3a5636519081e35John McCallpublic:
5bcfad54a43e5570e09daddd976bd4545933e75b1Fariborz Jahanian   A() : A::m(17) { } // expected-error {{member initializer 'm' does not name a non-static data member or base class}}
6d7b27e1c17d40c72a1ccf8868315bf0c5271aa54Fariborz Jahanian   A(int);
77ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor};
87ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor
97ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregorclass B : public A {
107ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregorpublic:
117ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor  B() : A(), m(1), n(3.14) { }
127ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor
137ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregorprivate:
147ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor  int m;
157ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor  float n;
167ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor};
177ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor
187ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor
197ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregorclass C : public virtual B {
207ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregorpublic:
217ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor  C() : B() { }
227ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor};
237ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor
247ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregorclass D : public C {
257ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregorpublic:
267ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor  D() : B(), C() { }
277ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor};
287ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor
297ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregorclass E : public D, public B {
307ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregorpublic:
317c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall  E() : B(), D() { } // expected-error{{base class initializer 'B' names both a direct base class and an inherited virtual base class}}
327ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor};
337ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor
347ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor
357ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregortypedef int INT;
367ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor
377ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregorclass F : public B {
387ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregorpublic:
397ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor  int B;
407ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor
417ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor  F() : B(17),
427ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor        m(17), // expected-error{{member initializer 'm' does not name a non-static data member or base class}}
43d0344a4a6182ad704881cbbaa21cca14913d2296Chris Lattner        INT(17) // expected-error{{constructor initializer 'INT' (aka 'int') does not name a class}}
447ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor  {
457ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor  }
467ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor};
473f08d181f620e6bf4971c436fc9878f98a02bbe3Douglas Gregor
483f08d181f620e6bf4971c436fc9878f98a02bbe3Douglas Gregorclass G : A {
493f08d181f620e6bf4971c436fc9878f98a02bbe3Douglas Gregor  G() : A(10); // expected-error{{expected '{'}}
503f08d181f620e6bf4971c436fc9878f98a02bbe3Douglas Gregor};
51a7b3521ef52d983bd0e7fa562bb9ef1393f14634Anders Carlsson
52a7b3521ef52d983bd0e7fa562bb9ef1393f14634Anders Carlssonvoid f() : a(242) { } // expected-error{{only constructors take base initializers}}
53a7b3521ef52d983bd0e7fa562bb9ef1393f14634Anders Carlsson
54a7b3521ef52d983bd0e7fa562bb9ef1393f14634Anders Carlssonclass H : A {
55a7b3521ef52d983bd0e7fa562bb9ef1393f14634Anders Carlsson  H();
56a7b3521ef52d983bd0e7fa562bb9ef1393f14634Anders Carlsson};
57a7b3521ef52d983bd0e7fa562bb9ef1393f14634Anders Carlsson
58a7b3521ef52d983bd0e7fa562bb9ef1393f14634Anders CarlssonH::H() : A(10) { }
59a7b3521ef52d983bd0e7fa562bb9ef1393f14634Anders Carlsson
609da7201adeab345fc7da72bcfcf30e11774fb8c4Fariborz Jahanian
619da7201adeab345fc7da72bcfcf30e11774fb8c4Fariborz Jahanianclass  X {};
629da7201adeab345fc7da72bcfcf30e11774fb8c4Fariborz Jahanianclass Y {};
639da7201adeab345fc7da72bcfcf30e11774fb8c4Fariborz Jahanian
649da7201adeab345fc7da72bcfcf30e11774fb8c4Fariborz Jahanianstruct S : Y, virtual X {
659da7201adeab345fc7da72bcfcf30e11774fb8c4Fariborz Jahanian  S ();
669da7201adeab345fc7da72bcfcf30e11774fb8c4Fariborz Jahanian};
679da7201adeab345fc7da72bcfcf30e11774fb8c4Fariborz Jahanian
689da7201adeab345fc7da72bcfcf30e11774fb8c4Fariborz Jahanianstruct Z : S {
697c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall  Z() : X(), S(), E()  {} // expected-error {{type 'E' is not a direct or virtual base of 'Z'}}
709da7201adeab345fc7da72bcfcf30e11774fb8c4Fariborz Jahanian};
719da7201adeab345fc7da72bcfcf30e11774fb8c4Fariborz Jahanian
725ac3dfc24bd2d8c5c0d9955f5de33c97e6aaaadfFariborz Jahanianclass U {
735ac3dfc24bd2d8c5c0d9955f5de33c97e6aaaadfFariborz Jahanian  union { int a; char* p; };
745ac3dfc24bd2d8c5c0d9955f5de33c97e6aaaadfFariborz Jahanian  union { int b; double d; };
755ac3dfc24bd2d8c5c0d9955f5de33c97e6aaaadfFariborz Jahanian
763c3ccdbe73cb43bdf39a9102f5f7eb842fb71952John McCall  U() :  a(1), // expected-note {{previous initialization is here}}
776fe2965ce722826ae7c3af85271f900286ef20c3David Blaikie         p(0), // expected-error {{initializing multiple members of union}}
783c3ccdbe73cb43bdf39a9102f5f7eb842fb71952John McCall         d(1.0)  {}
795ac3dfc24bd2d8c5c0d9955f5de33c97e6aaaadfFariborz Jahanian};
805ac3dfc24bd2d8c5c0d9955f5de33c97e6aaaadfFariborz Jahanian
81bcfad54a43e5570e09daddd976bd4545933e75b1Fariborz Jahanianstruct V {};
82bcfad54a43e5570e09daddd976bd4545933e75b1Fariborz Jahanianstruct Base {};
83bcfad54a43e5570e09daddd976bd4545933e75b1Fariborz Jahanianstruct Base1 {};
84bcfad54a43e5570e09daddd976bd4545933e75b1Fariborz Jahanian
85bcfad54a43e5570e09daddd976bd4545933e75b1Fariborz Jahanianstruct Derived : Base, Base1, virtual V {
86bcfad54a43e5570e09daddd976bd4545933e75b1Fariborz Jahanian  Derived ();
87bcfad54a43e5570e09daddd976bd4545933e75b1Fariborz Jahanian};
88bcfad54a43e5570e09daddd976bd4545933e75b1Fariborz Jahanian
89bcfad54a43e5570e09daddd976bd4545933e75b1Fariborz Jahanianstruct Current : Derived {
90bcfad54a43e5570e09daddd976bd4545933e75b1Fariborz Jahanian  int Derived;
91d6ca8da0f5a4115813055729faaa5128e994806dJohn McCall  Current() : Derived(1), ::Derived(), // expected-warning {{field 'Derived' will be initialized after base '::Derived'}} \
92d6ca8da0f5a4115813055729faaa5128e994806dJohn McCall                                       // expected-warning {{base class '::Derived' will be initialized after base 'Derived::V'}}
93bcfad54a43e5570e09daddd976bd4545933e75b1Fariborz Jahanian                          ::Derived::Base(), // expected-error {{type '::Derived::Base' is not a direct or virtual base of 'Current'}}
94bcfad54a43e5570e09daddd976bd4545933e75b1Fariborz Jahanian                           Derived::Base1(), // expected-error {{type 'Derived::Base1' is not a direct or virtual base of 'Current'}}
95d6ca8da0f5a4115813055729faaa5128e994806dJohn McCall                           Derived::V(),
96bcfad54a43e5570e09daddd976bd4545933e75b1Fariborz Jahanian                           ::NonExisting(), // expected-error {{member initializer 'NonExisting' does not name a non-static data member or}}
97bcfad54a43e5570e09daddd976bd4545933e75b1Fariborz Jahanian                           INT::NonExisting()  {} // expected-error {{expected a class or namespace}} \
981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                  // expected-error {{member initializer 'NonExisting' does not name a non-static data member or}}
99bcfad54a43e5570e09daddd976bd4545933e75b1Fariborz Jahanian};
10087595e46ccd61c9b7c08074c2c64b66b5c0fc694Fariborz Jahanian
101220ccbf2c9ef97034cce80561f9f46c4f1f63bc7John McCallstruct M {              // expected-note 2 {{candidate constructor (the implicit copy constructor)}} \
10249c16da71b9c95cc53b4af6de2833a022cb69b6aEli Friedman                        // expected-note {{declared here}} \
10349c16da71b9c95cc53b4af6de2833a022cb69b6aEli Friedman                        // expected-note {{declared here}}
104b1622a1fd7b7f4ab8d00d0183d17c90ad25c14e3John McCall  M(int i, int j);      // expected-note 2 {{candidate constructor}}
10587595e46ccd61c9b7c08074c2c64b66b5c0fc694Fariborz Jahanian};
10687595e46ccd61c9b7c08074c2c64b66b5c0fc694Fariborz Jahanian
10787595e46ccd61c9b7c08074c2c64b66b5c0fc694Fariborz Jahanianstruct N : M  {
1087c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall  N() : M(1),        // expected-error {{no matching constructor for initialization of 'M'}}
1097c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall        m1(100) {  } // expected-error {{no matching constructor for initialization of 'M'}}
11087595e46ccd61c9b7c08074c2c64b66b5c0fc694Fariborz Jahanian  M m1;
11187595e46ccd61c9b7c08074c2c64b66b5c0fc694Fariborz Jahanian};
11287595e46ccd61c9b7c08074c2c64b66b5c0fc694Fariborz Jahanian
11349c16da71b9c95cc53b4af6de2833a022cb69b6aEli Friedmanstruct P : M  {
1147c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall  P()  {  } // expected-error {{constructor for 'P' must explicitly initialize the base class 'M' which does not have a default constructor}} \
11549c16da71b9c95cc53b4af6de2833a022cb69b6aEli Friedman            // expected-error {{member 'm'}}
11649c16da71b9c95cc53b4af6de2833a022cb69b6aEli Friedman  M m; // expected-note {{member is declared here}}
11787595e46ccd61c9b7c08074c2c64b66b5c0fc694Fariborz Jahanian};
11887595e46ccd61c9b7c08074c2c64b66b5c0fc694Fariborz Jahanian
1197252f5110de3163a465aa50a2114c1fef9e848e8Fariborz Jahanianstruct Q {
1209db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor  Q() : f1(1,2),       // expected-error {{excess elements in scalar initializer}}
1219db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor        pf(0.0)  { }   // expected-error {{cannot initialize a member subobject of type 'float *' with an rvalue of type 'double'}}
1227252f5110de3163a465aa50a2114c1fef9e848e8Fariborz Jahanian  float f1;
1237252f5110de3163a465aa50a2114c1fef9e848e8Fariborz Jahanian
1247252f5110de3163a465aa50a2114c1fef9e848e8Fariborz Jahanian  float *pf;
1257252f5110de3163a465aa50a2114c1fef9e848e8Fariborz Jahanian};
126b41900410fae8cba4bc02db2e3e44142e7f4c625John McCall
127b41900410fae8cba4bc02db2e3e44142e7f4c625John McCall// A silly class used to demonstrate field-is-uninitialized in constructors with
128b41900410fae8cba4bc02db2e3e44142e7f4c625John McCall// multiple params.
1297002f4c03c2d0544f4e8bea8d3a5636519081e35John McCallclass TwoInOne { public: TwoInOne(TwoInOne a, TwoInOne b) {} };
130b41900410fae8cba4bc02db2e3e44142e7f4c625John McCallclass InitializeUsingSelfTest {
131b41900410fae8cba4bc02db2e3e44142e7f4c625John McCall  bool A;
132b41900410fae8cba4bc02db2e3e44142e7f4c625John McCall  char* B;
133b41900410fae8cba4bc02db2e3e44142e7f4c625John McCall  int C;
134b41900410fae8cba4bc02db2e3e44142e7f4c625John McCall  TwoInOne D;
135b41900410fae8cba4bc02db2e3e44142e7f4c625John McCall  InitializeUsingSelfTest(int E)
136b41900410fae8cba4bc02db2e3e44142e7f4c625John McCall      : A(A),  // expected-warning {{field is uninitialized when used here}}
137b41900410fae8cba4bc02db2e3e44142e7f4c625John McCall        B((((B)))),  // expected-warning {{field is uninitialized when used here}}
138b41900410fae8cba4bc02db2e3e44142e7f4c625John McCall        C(A && InitializeUsingSelfTest::C),  // expected-warning {{field is uninitialized when used here}}
139b41900410fae8cba4bc02db2e3e44142e7f4c625John McCall        D(D,  // expected-warning {{field is uninitialized when used here}}
140b41900410fae8cba4bc02db2e3e44142e7f4c625John McCall          D) {}  // expected-warning {{field is uninitialized when used here}}
141b41900410fae8cba4bc02db2e3e44142e7f4c625John McCall};
142b41900410fae8cba4bc02db2e3e44142e7f4c625John McCall
143b41900410fae8cba4bc02db2e3e44142e7f4c625John McCallint IntWrapper(int i) { return 0; };
144b41900410fae8cba4bc02db2e3e44142e7f4c625John McCallclass InitializeUsingSelfExceptions {
145b41900410fae8cba4bc02db2e3e44142e7f4c625John McCall  int A;
146b41900410fae8cba4bc02db2e3e44142e7f4c625John McCall  int B;
147ff8819be64c53d71dcc0200ece9b2738041c80e2Argyrios Kyrtzidis  int C;
148ff8819be64c53d71dcc0200ece9b2738041c80e2Argyrios Kyrtzidis  void *P;
149b41900410fae8cba4bc02db2e3e44142e7f4c625John McCall  InitializeUsingSelfExceptions(int B)
150b41900410fae8cba4bc02db2e3e44142e7f4c625John McCall      : A(IntWrapper(A)),  // Due to a conservative implementation, we do not report warnings inside function/ctor calls even though it is possible to do so.
151ff8819be64c53d71dcc0200ece9b2738041c80e2Argyrios Kyrtzidis        B(B),  // Not a warning; B is a local variable.
152ff8819be64c53d71dcc0200ece9b2738041c80e2Argyrios Kyrtzidis        C(sizeof(C)),  // sizeof doesn't reference contents, do not warn
153ff8819be64c53d71dcc0200ece9b2738041c80e2Argyrios Kyrtzidis        P(&P) {} // address-of doesn't reference contents (the pointer may be dereferenced in the same expression but it would be rare; and weird)
154b41900410fae8cba4bc02db2e3e44142e7f4c625John McCall};
155b41900410fae8cba4bc02db2e3e44142e7f4c625John McCall
156b41900410fae8cba4bc02db2e3e44142e7f4c625John McCallclass CopyConstructorTest {
157b41900410fae8cba4bc02db2e3e44142e7f4c625John McCall  bool A, B, C;
158b41900410fae8cba4bc02db2e3e44142e7f4c625John McCall  CopyConstructorTest(const CopyConstructorTest& rhs)
159b41900410fae8cba4bc02db2e3e44142e7f4c625John McCall      : A(rhs.A),
160b41900410fae8cba4bc02db2e3e44142e7f4c625John McCall        B(B),  // expected-warning {{field is uninitialized when used here}}
161b41900410fae8cba4bc02db2e3e44142e7f4c625John McCall        C(rhs.C || C) { }  // expected-warning {{field is uninitialized when used here}}
162b41900410fae8cba4bc02db2e3e44142e7f4c625John McCall};
163c07a494b376f75f33759cf09ad188b11ef3fa9d5Douglas Gregor
164c07a494b376f75f33759cf09ad188b11ef3fa9d5Douglas Gregor// Make sure we aren't marking default constructors when we shouldn't be.
165c07a494b376f75f33759cf09ad188b11ef3fa9d5Douglas Gregortemplate<typename T>
166c07a494b376f75f33759cf09ad188b11ef3fa9d5Douglas Gregorstruct NDC {
167c07a494b376f75f33759cf09ad188b11ef3fa9d5Douglas Gregor  T &ref;
168c07a494b376f75f33759cf09ad188b11ef3fa9d5Douglas Gregor
169c07a494b376f75f33759cf09ad188b11ef3fa9d5Douglas Gregor  NDC() { }
170c07a494b376f75f33759cf09ad188b11ef3fa9d5Douglas Gregor  NDC(T &ref) : ref(ref) { }
171c07a494b376f75f33759cf09ad188b11ef3fa9d5Douglas Gregor};
172c07a494b376f75f33759cf09ad188b11ef3fa9d5Douglas Gregor
173c07a494b376f75f33759cf09ad188b11ef3fa9d5Douglas Gregorstruct X0 : NDC<int> {
174c07a494b376f75f33759cf09ad188b11ef3fa9d5Douglas Gregor  X0(int &ref) : NDC<int>(ref), ndc(ref) { }
175c07a494b376f75f33759cf09ad188b11ef3fa9d5Douglas Gregor
176c07a494b376f75f33759cf09ad188b11ef3fa9d5Douglas Gregor  NDC<int> ndc;
177c07a494b376f75f33759cf09ad188b11ef3fa9d5Douglas Gregor};
178114a297ef02a722b3afcd719210c060811d431e0Anders Carlsson
179114a297ef02a722b3afcd719210c060811d431e0Anders Carlssonnamespace Test0 {
180114a297ef02a722b3afcd719210c060811d431e0Anders Carlsson
181114a297ef02a722b3afcd719210c060811d431e0Anders Carlssonstruct A { A(); };
182114a297ef02a722b3afcd719210c060811d431e0Anders Carlsson
183114a297ef02a722b3afcd719210c060811d431e0Anders Carlssonstruct B {
184114a297ef02a722b3afcd719210c060811d431e0Anders Carlsson  B() { }
185114a297ef02a722b3afcd719210c060811d431e0Anders Carlsson  const A a;
186114a297ef02a722b3afcd719210c060811d431e0Anders Carlsson};
187114a297ef02a722b3afcd719210c060811d431e0Anders Carlsson
188114a297ef02a722b3afcd719210c060811d431e0Anders Carlsson}
1890d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall
1909fd682b960bf0628299c46a1a07a7cc5a6dcba01Anders Carlssonnamespace Test1 {
1910d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall  struct A {
1920d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall    enum Kind { Foo } Kind;
1930d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall    A() : Kind(Foo) {}
1940d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall  };
1950d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall}
1969fd682b960bf0628299c46a1a07a7cc5a6dcba01Anders Carlsson
1979fd682b960bf0628299c46a1a07a7cc5a6dcba01Anders Carlssonnamespace Test2 {
1989fd682b960bf0628299c46a1a07a7cc5a6dcba01Anders Carlsson
1999fd682b960bf0628299c46a1a07a7cc5a6dcba01Anders Carlssonstruct A {
2009fd682b960bf0628299c46a1a07a7cc5a6dcba01Anders Carlsson  A(const A&);
2019fd682b960bf0628299c46a1a07a7cc5a6dcba01Anders Carlsson};
2029fd682b960bf0628299c46a1a07a7cc5a6dcba01Anders Carlsson
2039fd682b960bf0628299c46a1a07a7cc5a6dcba01Anders Carlssonstruct B : virtual A { };
2049fd682b960bf0628299c46a1a07a7cc5a6dcba01Anders Carlssonstruct C : A, B { };
2059fd682b960bf0628299c46a1a07a7cc5a6dcba01Anders Carlsson
2069fd682b960bf0628299c46a1a07a7cc5a6dcba01Anders CarlssonC f(C c) {
2079fd682b960bf0628299c46a1a07a7cc5a6dcba01Anders Carlsson  return c;
2089fd682b960bf0628299c46a1a07a7cc5a6dcba01Anders Carlsson}
2099fd682b960bf0628299c46a1a07a7cc5a6dcba01Anders Carlsson
2109fd682b960bf0628299c46a1a07a7cc5a6dcba01Anders Carlsson}
211e861c60bde74cf495447f50844d7ee7ea3a8a7a0Chandler Carruth
212e861c60bde74cf495447f50844d7ee7ea3a8a7a0Chandler Carruth// Don't build implicit initializers for anonymous union fields when we already
213e861c60bde74cf495447f50844d7ee7ea3a8a7a0Chandler Carruth// have an explicit initializer for another field in the union.
214e861c60bde74cf495447f50844d7ee7ea3a8a7a0Chandler Carruthnamespace PR7402 {
215e861c60bde74cf495447f50844d7ee7ea3a8a7a0Chandler Carruth  struct S {
216e861c60bde74cf495447f50844d7ee7ea3a8a7a0Chandler Carruth    union {
217e861c60bde74cf495447f50844d7ee7ea3a8a7a0Chandler Carruth      void* ptr_;
218e861c60bde74cf495447f50844d7ee7ea3a8a7a0Chandler Carruth      struct { int i_; };
219e861c60bde74cf495447f50844d7ee7ea3a8a7a0Chandler Carruth    };
220e861c60bde74cf495447f50844d7ee7ea3a8a7a0Chandler Carruth
221e861c60bde74cf495447f50844d7ee7ea3a8a7a0Chandler Carruth    template <typename T> S(T) : ptr_(0) { }
222e861c60bde74cf495447f50844d7ee7ea3a8a7a0Chandler Carruth  };
223e861c60bde74cf495447f50844d7ee7ea3a8a7a0Chandler Carruth
224e861c60bde74cf495447f50844d7ee7ea3a8a7a0Chandler Carruth  void f() {
225e861c60bde74cf495447f50844d7ee7ea3a8a7a0Chandler Carruth    S s(3);
226e861c60bde74cf495447f50844d7ee7ea3a8a7a0Chandler Carruth  }
227e861c60bde74cf495447f50844d7ee7ea3a8a7a0Chandler Carruth}
228572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall
229572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall// <rdar://problem/8308215>: don't crash.
230572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall// Lots of questionable recovery here;  errors can change.
231572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCallnamespace test3 {
232572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall  class A : public std::exception {}; // expected-error {{undeclared identifier}} expected-error {{expected class name}} expected-note 3 {{candidate}} expected-note {{passing argument}}
233572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall  class B : public A {
234572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall  public:
235572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall    B(const String& s, int e=0) // expected-error {{unknown type name}}
236572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall      : A(e), m_String(s) , m_ErrorStr(__null) {} // expected-error {{no matching constructor}} expected-error {{does not name}}
237572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall    B(const B& e)
238572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall      : A(e), m_String(e.m_String), m_ErrorStr(__null) { // expected-error {{no viable conversion}} expected-error {{does not name}}
239572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall    }
240572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall  };
241572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall}
242175ffbf7db893181b301e201c561ac928266f4beAnders Carlsson
243175ffbf7db893181b301e201c561ac928266f4beAnders Carlsson// PR8075
244175ffbf7db893181b301e201c561ac928266f4beAnders Carlssonnamespace PR8075 {
245175ffbf7db893181b301e201c561ac928266f4beAnders Carlsson
246175ffbf7db893181b301e201c561ac928266f4beAnders Carlssonstruct S1 {
247175ffbf7db893181b301e201c561ac928266f4beAnders Carlsson  enum { FOO = 42 };
248175ffbf7db893181b301e201c561ac928266f4beAnders Carlsson  static const int bar = 42;
249175ffbf7db893181b301e201c561ac928266f4beAnders Carlsson  static int baz();
250175ffbf7db893181b301e201c561ac928266f4beAnders Carlsson  S1(int);
251175ffbf7db893181b301e201c561ac928266f4beAnders Carlsson};
252175ffbf7db893181b301e201c561ac928266f4beAnders Carlsson
253175ffbf7db893181b301e201c561ac928266f4beAnders Carlssonconst int S1::bar;
254175ffbf7db893181b301e201c561ac928266f4beAnders Carlsson
255175ffbf7db893181b301e201c561ac928266f4beAnders Carlssonstruct S2 {
256175ffbf7db893181b301e201c561ac928266f4beAnders Carlsson  S1 s1;
257175ffbf7db893181b301e201c561ac928266f4beAnders Carlsson  S2() : s1(s1.FOO) {}
258175ffbf7db893181b301e201c561ac928266f4beAnders Carlsson};
259175ffbf7db893181b301e201c561ac928266f4beAnders Carlsson
260175ffbf7db893181b301e201c561ac928266f4beAnders Carlssonstruct S3 {
261175ffbf7db893181b301e201c561ac928266f4beAnders Carlsson  S1 s1;
262175ffbf7db893181b301e201c561ac928266f4beAnders Carlsson  S3() : s1(s1.bar) {}
263175ffbf7db893181b301e201c561ac928266f4beAnders Carlsson};
264175ffbf7db893181b301e201c561ac928266f4beAnders Carlsson
265175ffbf7db893181b301e201c561ac928266f4beAnders Carlssonstruct S4 {
266175ffbf7db893181b301e201c561ac928266f4beAnders Carlsson  S1 s1;
267175ffbf7db893181b301e201c561ac928266f4beAnders Carlsson  S4() : s1(s1.baz()) {}
268175ffbf7db893181b301e201c561ac928266f4beAnders Carlsson};
269175ffbf7db893181b301e201c561ac928266f4beAnders Carlsson
270175ffbf7db893181b301e201c561ac928266f4beAnders Carlsson}
271e9ee382c32a83e9807a2fe4cfd52b5a11169a4b8Eli Friedman
272e9ee382c32a83e9807a2fe4cfd52b5a11169a4b8Eli Friedmannamespace PR12049 {
273e9ee382c32a83e9807a2fe4cfd52b5a11169a4b8Eli Friedman  int function();
274e9ee382c32a83e9807a2fe4cfd52b5a11169a4b8Eli Friedman
275e9ee382c32a83e9807a2fe4cfd52b5a11169a4b8Eli Friedman  class Class
276e9ee382c32a83e9807a2fe4cfd52b5a11169a4b8Eli Friedman  {
277e9ee382c32a83e9807a2fe4cfd52b5a11169a4b8Eli Friedman  public:
278e9ee382c32a83e9807a2fe4cfd52b5a11169a4b8Eli Friedman      Class() : member(function() {} // expected-note {{to match this '('}}
279e9ee382c32a83e9807a2fe4cfd52b5a11169a4b8Eli Friedman
280e9ee382c32a83e9807a2fe4cfd52b5a11169a4b8Eli Friedman      int member; // expected-error {{expected ')'}}
281e9ee382c32a83e9807a2fe4cfd52b5a11169a4b8Eli Friedman  };
282e9ee382c32a83e9807a2fe4cfd52b5a11169a4b8Eli Friedman}
283