18fbe78f6SDaniel Dunbar // RUN: %clang_cc1 -fsyntax-only -verify %s
2*6de8aca1SCharles Li // RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
3*6de8aca1SCharles Li // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
41c9d5d95SFariborz Jahanian 
51c9d5d95SFariborz Jahanian struct X1 { // has no implicit default constructor
61c9d5d95SFariborz Jahanian    X1(int);
71c9d5d95SFariborz Jahanian };
81c9d5d95SFariborz Jahanian 
9*6de8aca1SCharles Li struct X2  : X1 {
10*6de8aca1SCharles Li #if __cplusplus <= 199711L
11*6de8aca1SCharles Li // expected-note@-2 2 {{'X2' declared here}}
12*6de8aca1SCharles Li #endif
13*6de8aca1SCharles Li 
141c9d5d95SFariborz Jahanian    X2(int);
151c9d5d95SFariborz Jahanian };
161c9d5d95SFariborz Jahanian 
17*6de8aca1SCharles Li struct X3 : public X2 {
18*6de8aca1SCharles Li #if __cplusplus <= 199711L
19*6de8aca1SCharles Li // expected-error@-2 {{implicit default constructor for 'X3' must explicitly initialize the base class 'X2' which does not have a default constructor}}
20*6de8aca1SCharles Li #else
21*6de8aca1SCharles Li // expected-note@-4 {{default constructor of 'X3' is implicitly deleted because base class 'X2' has no default constructor}}
22*6de8aca1SCharles Li #endif
231c9d5d95SFariborz Jahanian };
241c9d5d95SFariborz Jahanian 
25*6de8aca1SCharles Li X3 x3;
26*6de8aca1SCharles Li #if __cplusplus <= 199711L
27*6de8aca1SCharles Li // expected-note@-2 {{first required here}}
28*6de8aca1SCharles Li #else
29*6de8aca1SCharles Li // expected-error@-4 {{call to implicitly-deleted default constructor of 'X3'}}
30*6de8aca1SCharles Li #endif
311c9d5d95SFariborz Jahanian 
32*6de8aca1SCharles Li struct X4 {
33*6de8aca1SCharles Li #if __cplusplus <= 199711L
34*6de8aca1SCharles Li // expected-error@-2 {{must explicitly initialize the member 'x2'}}
35*6de8aca1SCharles Li // expected-error@-3 {{must explicitly initialize the reference member 'rx2'}}
36*6de8aca1SCharles Li #endif
37*6de8aca1SCharles Li 
38*6de8aca1SCharles Li   X2 x2;
39*6de8aca1SCharles Li #if __cplusplus <= 199711L
40*6de8aca1SCharles Li   // expected-note@-2 {{member is declared here}}
41*6de8aca1SCharles Li #else
42*6de8aca1SCharles Li   // expected-note@-4 {{default constructor of 'X4' is implicitly deleted because field 'x2' has no default constructor}}
43*6de8aca1SCharles Li #endif
44*6de8aca1SCharles Li 
45*6de8aca1SCharles Li   X2 & rx2;
46*6de8aca1SCharles Li #if __cplusplus <= 199711L
47*6de8aca1SCharles Li   // expected-note@-2 {{declared here}}
48*6de8aca1SCharles Li #endif
49*6de8aca1SCharles Li };
50*6de8aca1SCharles Li 
51*6de8aca1SCharles Li X4 x4;
52*6de8aca1SCharles Li #if __cplusplus <= 199711L
53*6de8aca1SCharles Li // expected-note@-2 {{first required here}}
54*6de8aca1SCharles Li #else
55*6de8aca1SCharles Li // expected-error@-4 {{call to implicitly-deleted default constructor of 'X4'}}
56*6de8aca1SCharles Li #endif
571c9d5d95SFariborz Jahanian 
581c9d5d95SFariborz Jahanian struct Y1 { // has no implicit default constructor
591c9d5d95SFariborz Jahanian    Y1(int);
601c9d5d95SFariborz Jahanian };
611c9d5d95SFariborz Jahanian 
621c9d5d95SFariborz Jahanian struct Y2  : Y1 {
631c9d5d95SFariborz Jahanian    Y2(int);
641c9d5d95SFariborz Jahanian    Y2();
651c9d5d95SFariborz Jahanian };
661c9d5d95SFariborz Jahanian 
671c9d5d95SFariborz Jahanian struct Y3 : public Y2 {
681c9d5d95SFariborz Jahanian };
691c9d5d95SFariborz Jahanian Y3 y3;
701c9d5d95SFariborz Jahanian 
711c9d5d95SFariborz Jahanian struct Y4 {
721c9d5d95SFariborz Jahanian   Y2 y2;
731c9d5d95SFariborz Jahanian };
741c9d5d95SFariborz Jahanian 
751c9d5d95SFariborz Jahanian Y4 y4;
761c9d5d95SFariborz Jahanian 
771c9d5d95SFariborz Jahanian // More tests
781c9d5d95SFariborz Jahanian 
79*6de8aca1SCharles Li struct Z1 {
80*6de8aca1SCharles Li #if __cplusplus <= 199711L
81*6de8aca1SCharles Li // expected-error@-2 {{must explicitly initialize the reference member 'z'}}
82*6de8aca1SCharles Li // expected-error@-3 {{must explicitly initialize the const member 'c1'}}
83*6de8aca1SCharles Li #endif
84*6de8aca1SCharles Li 
85*6de8aca1SCharles Li   int& z;
86*6de8aca1SCharles Li #if __cplusplus <= 199711L
87*6de8aca1SCharles Li   // expected-note@-2 {{declared here}}
88*6de8aca1SCharles Li #else
89*6de8aca1SCharles Li   // expected-note@-4 {{default constructor of 'Z1' is implicitly deleted because field 'z' of reference type 'int &' would not be initialized}}
90*6de8aca1SCharles Li #endif
91*6de8aca1SCharles Li 
92*6de8aca1SCharles Li   const int c1;
93*6de8aca1SCharles Li #if __cplusplus <= 199711L
94*6de8aca1SCharles Li   // expected-note@-2 {{declared here}}
95*6de8aca1SCharles Li #endif
961c9d5d95SFariborz Jahanian   volatile int v1;
971c9d5d95SFariborz Jahanian };
981c9d5d95SFariborz Jahanian 
99c9262401SChandler Carruth // Test default initialization which *requires* a constructor call for non-POD.
100*6de8aca1SCharles Li Z1 z1;
101*6de8aca1SCharles Li #if __cplusplus <= 199711L
102*6de8aca1SCharles Li // expected-note@-2 {{first required here}}
103*6de8aca1SCharles Li #else
104*6de8aca1SCharles Li // expected-error@-4 {{call to implicitly-deleted default constructor of 'Z1'}}
105*6de8aca1SCharles Li #endif
1061c9d5d95SFariborz Jahanian 
107c9262401SChandler Carruth // Ensure that value initialization doesn't use trivial implicit constructors.
108c9262401SChandler Carruth namespace PR7948 {
109c9262401SChandler Carruth   // Note that this is also non-POD to ensure we don't just special case PODs.
110c9262401SChandler Carruth   struct S { const int x; ~S(); };
111c9262401SChandler Carruth   const S arr[2] = { { 42 } };
112c9262401SChandler Carruth }
1138b455184SAlexis Hunt 
1148b455184SAlexis Hunt // This is valid
1158b455184SAlexis Hunt union U {
1168b455184SAlexis Hunt   const int i;
1178b455184SAlexis Hunt   float f;
1188b455184SAlexis Hunt };
1198b455184SAlexis Hunt U u;
120