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