1 // RUN: %clang_cc1 -fsyntax-only -verify %s 2 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s 3 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s 4 5 struct X1 { // has no implicit default constructor 6 X1(int); 7 }; 8 9 struct X2 : X1 { 10 #if __cplusplus <= 199711L 11 // expected-note@-2 2 {{'X2' declared here}} 12 #endif 13 14 X2(int); 15 }; 16 17 struct X3 : public X2 { 18 #if __cplusplus <= 199711L 19 // expected-error@-2 {{implicit default constructor for 'X3' must explicitly initialize the base class 'X2' which does not have a default constructor}} 20 #else 21 // expected-note@-4 {{default constructor of 'X3' is implicitly deleted because base class 'X2' has no default constructor}} 22 #endif 23 }; 24 25 X3 x3; 26 #if __cplusplus <= 199711L 27 // expected-note@-2 {{first required here}} 28 #else 29 // expected-error@-4 {{call to implicitly-deleted default constructor of 'X3'}} 30 #endif 31 32 struct X4 { 33 #if __cplusplus <= 199711L 34 // expected-error@-2 {{must explicitly initialize the member 'x2'}} 35 // expected-error@-3 {{must explicitly initialize the reference member 'rx2'}} 36 #endif 37 38 X2 x2; 39 #if __cplusplus <= 199711L 40 // expected-note@-2 {{member is declared here}} 41 #else 42 // expected-note@-4 {{default constructor of 'X4' is implicitly deleted because field 'x2' has no default constructor}} 43 #endif 44 45 X2 & rx2; 46 #if __cplusplus <= 199711L 47 // expected-note@-2 {{declared here}} 48 #endif 49 }; 50 51 X4 x4; 52 #if __cplusplus <= 199711L 53 // expected-note@-2 {{first required here}} 54 #else 55 // expected-error@-4 {{call to implicitly-deleted default constructor of 'X4'}} 56 #endif 57 58 struct Y1 { // has no implicit default constructor 59 Y1(int); 60 }; 61 62 struct Y2 : Y1 { 63 Y2(int); 64 Y2(); 65 }; 66 67 struct Y3 : public Y2 { 68 }; 69 Y3 y3; 70 71 struct Y4 { 72 Y2 y2; 73 }; 74 75 Y4 y4; 76 77 // More tests 78 79 struct Z1 { 80 #if __cplusplus <= 199711L 81 // expected-error@-2 {{must explicitly initialize the reference member 'z'}} 82 // expected-error@-3 {{must explicitly initialize the const member 'c1'}} 83 #endif 84 85 int& z; 86 #if __cplusplus <= 199711L 87 // expected-note@-2 {{declared here}} 88 #else 89 // expected-note@-4 {{default constructor of 'Z1' is implicitly deleted because field 'z' of reference type 'int &' would not be initialized}} 90 #endif 91 92 const int c1; 93 #if __cplusplus <= 199711L 94 // expected-note@-2 {{declared here}} 95 #endif 96 volatile int v1; 97 }; 98 99 // Test default initialization which *requires* a constructor call for non-POD. 100 Z1 z1; 101 #if __cplusplus <= 199711L 102 // expected-note@-2 {{first required here}} 103 #else 104 // expected-error@-4 {{call to implicitly-deleted default constructor of 'Z1'}} 105 #endif 106 107 // Ensure that value initialization doesn't use trivial implicit constructors. 108 namespace PR7948 { 109 // Note that this is also non-POD to ensure we don't just special case PODs. 110 struct S { const int x; ~S(); }; 111 const S arr[2] = { { 42 } }; 112 } 113 114 // This is valid 115 union U { 116 const int i; 117 float f; 118 }; 119 U u; 120