18fbe78f6SDaniel Dunbar // RUN: %clang_cc1 -fsyntax-only -verify %s
21c9d5d95SFariborz Jahanian 
31c9d5d95SFariborz Jahanian struct X1 { // has no implicit default constructor
41c9d5d95SFariborz Jahanian    X1(int);
51c9d5d95SFariborz Jahanian };
61c9d5d95SFariborz Jahanian 
785f90559SJohn McCall struct X2  : X1 {  // expected-note 2 {{'X2' declared here}}
81c9d5d95SFariborz Jahanian    X2(int);
91c9d5d95SFariborz Jahanian };
101c9d5d95SFariborz Jahanian 
1185f90559SJohn McCall struct X3 : public X2 { // expected-error {{implicit default constructor for 'X3' must explicitly initialize the base class 'X2' which does not have a default constructor}}
121c9d5d95SFariborz Jahanian };
139cf6b594SEli Friedman X3 x3; // expected-note {{first required here}}
141c9d5d95SFariborz Jahanian 
151c9d5d95SFariborz Jahanian 
16d7686ef3SEli Friedman struct X4 { // expected-error {{must explicitly initialize the member 'x2'}} \
17d7686ef3SEli Friedman             // expected-error {{must explicitly initialize the reference member 'rx2'}}
188ae5b0a1SFariborz Jahanian   X2 x2; 	// expected-note {{member is declared here}}
1958e24a8fSAnders Carlsson   X2 & rx2; // expected-note {{declared here}}
201c9d5d95SFariborz Jahanian };
211c9d5d95SFariborz Jahanian 
229cf6b594SEli Friedman X4 x4; // expected-note {{first required here}}
231c9d5d95SFariborz Jahanian 
241c9d5d95SFariborz Jahanian 
251c9d5d95SFariborz Jahanian struct Y1 { // has no implicit default constructor
261c9d5d95SFariborz Jahanian    Y1(int);
271c9d5d95SFariborz Jahanian };
281c9d5d95SFariborz Jahanian 
291c9d5d95SFariborz Jahanian struct Y2  : Y1 {
301c9d5d95SFariborz Jahanian    Y2(int);
311c9d5d95SFariborz Jahanian    Y2();
321c9d5d95SFariborz Jahanian };
331c9d5d95SFariborz Jahanian 
341c9d5d95SFariborz Jahanian struct Y3 : public Y2 {
351c9d5d95SFariborz Jahanian };
361c9d5d95SFariborz Jahanian Y3 y3;
371c9d5d95SFariborz Jahanian 
381c9d5d95SFariborz Jahanian struct Y4 {
391c9d5d95SFariborz Jahanian   Y2 y2;
401c9d5d95SFariborz Jahanian };
411c9d5d95SFariborz Jahanian 
421c9d5d95SFariborz Jahanian Y4 y4;
431c9d5d95SFariborz Jahanian 
441c9d5d95SFariborz Jahanian // More tests
451c9d5d95SFariborz Jahanian 
46d7686ef3SEli Friedman struct Z1 { // expected-error {{must explicitly initialize the reference member 'z'}} \
47d7686ef3SEli Friedman             // expected-error {{must explicitly initialize the const member 'c1'}}
4858e24a8fSAnders Carlsson   int& z;       // expected-note {{declared here}}
4958e24a8fSAnders Carlsson   const int c1; // expected-note {{declared here}}
501c9d5d95SFariborz Jahanian   volatile int v1;
511c9d5d95SFariborz Jahanian };
521c9d5d95SFariborz Jahanian 
53c9262401SChandler Carruth // Test default initialization which *requires* a constructor call for non-POD.
549cf6b594SEli Friedman Z1 z1; // expected-note {{first required here}}
551c9d5d95SFariborz Jahanian 
56c9262401SChandler Carruth // Ensure that value initialization doesn't use trivial implicit constructors.
57c9262401SChandler Carruth namespace PR7948 {
58c9262401SChandler Carruth   // Note that this is also non-POD to ensure we don't just special case PODs.
59c9262401SChandler Carruth   struct S { const int x; ~S(); };
60c9262401SChandler Carruth   const S arr[2] = { { 42 } };
61c9262401SChandler Carruth }
62*8b455184SAlexis Hunt 
63*8b455184SAlexis Hunt // This is valid
64*8b455184SAlexis Hunt union U {
65*8b455184SAlexis Hunt   const int i;
66*8b455184SAlexis Hunt   float f;
67*8b455184SAlexis Hunt };
68*8b455184SAlexis Hunt U u;
69