1 // RUN: %clang_cc1 -fsyntax-only -pedantic -verify %s 2 // RUN: %clang_cc1 -fsyntax-only -pedantic -verify -std=c++98 %s 3 // RUN: %clang_cc1 -fsyntax-only -pedantic -verify -std=c++11 %s 4 // C++ [dcl.init.aggr]p2 5 struct A { 6 int x; 7 struct B { 8 int i; 9 int j; 10 } b; 11 } a1 = { 1, { 2, 3 } }; 12 13 struct NonAggregate { 14 #if __cplusplus >= 201103L 15 // expected-note@-2 3 {{candidate constructor (the implicit copy constructor) not viable}} 16 // expected-note@-3 3 {{candidate constructor (the implicit move constructor) not viable}} 17 #endif 18 NonAggregate(); 19 #if __cplusplus >= 201103L 20 // expected-note@-2 3 {{candidate constructor not viable: requires 0 arguments, but 2 were provided}} 21 #endif 22 int a, b; 23 }; 24 NonAggregate non_aggregate_test = { 1, 2 }; 25 #if __cplusplus <= 199711L 26 // expected-error@-2 {{non-aggregate type 'NonAggregate' cannot be initialized with an initializer list}} 27 #else 28 // expected-error@-4 {{no matching constructor for initialization of 'NonAggregate'}} 29 #endif 30 31 NonAggregate non_aggregate_test2[2] = { { 1, 2 }, { 3, 4 } }; 32 #if __cplusplus <= 199711L 33 // expected-error@-2 2 {{non-aggregate type 'NonAggregate' cannot be initialized with an initializer list}} 34 #else 35 // expected-error@-4 2 {{no matching constructor for initialization of 'NonAggregate'}} 36 #endif 37 38 // C++ [dcl.init.aggr]p3 39 A a_init = A(); 40 41 // C++ [dcl.init.aggr]p4 42 int x[] = { 1, 3, 5 }; 43 int x_sizecheck[(sizeof(x) / sizeof(int)) == 3? 1 : -1]; 44 int x2[] = { }; // expected-warning{{zero size arrays are an extension}} 45 46 // C++ [dcl.init.aggr]p5 47 struct StaticMemberTest { 48 int i; 49 static int s; 50 int *j; 51 } smt = { 1, &smt.i }; 52 53 // C++ [dcl.init.aggr]p6 54 char cv[4] = { 'a', 's', 'd', 'f', 0 }; // expected-error{{excess elements in array initializer}} 55 56 // C++ [dcl.init.aggr]p7 57 struct TooFew { int a; char* b; int c; }; 58 TooFew too_few = { 1, "asdf" }; 59 #if __cplusplus <= 199711L 60 // expected-warning@-2 {{conversion from string literal to 'char *' is deprecated}} 61 #else 62 // expected-warning@-4 {{ISO C++11 does not allow conversion from string literal to 'char *'}} 63 #endif 64 65 struct NoDefaultConstructor { 66 #if __cplusplus <= 199711L 67 // expected-note@-2 3 {{candidate constructor (the implicit copy constructor)}} 68 // expected-note@-3 {{declared here}} 69 #else 70 // expected-note@-5 4 {{candidate constructor (the implicit copy constructor)}} 71 // expected-note@-6 4 {{candidate constructor (the implicit move constructor)}} 72 #endif 73 74 NoDefaultConstructor(int); 75 #if __cplusplus <= 199711L 76 // expected-note@-2 3 {{candidate constructor not viable: requires 1 argument, but 0 were provided}} 77 #else 78 // expected-note@-4 4 {{candidate constructor not viable: requires 1 argument, but 0 were provided}} 79 #endif 80 81 }; 82 struct TooFewError { 83 #if __cplusplus <= 199711L 84 // expected-error@-2 {{implicit default constructor for}} 85 #endif 86 87 int a; 88 NoDefaultConstructor nodef; 89 #if __cplusplus <= 199711L 90 // expected-note@-2 {{member is declared here}} 91 // expected-note@-3 2{{in implicit initialization of field 'nodef' with omitted initializer}} 92 #else 93 // expected-note@-5 3{{in implicit initialization of field 'nodef' with omitted initializer}} 94 #endif 95 }; 96 TooFewError too_few_okay = { 1, 1 }; 97 TooFewError too_few_error = { 1 }; // expected-error{{no matching constructor}} 98 99 TooFewError too_few_okay2[2] = { 1, 1 }; 100 #if __cplusplus <= 199711L 101 // expected-note@-2 {{implicit default constructor for 'TooFewError' first required here}} 102 #else 103 // expected-error@-4 {{no matching constructor for initialization of 'NoDefaultConstructor'}} 104 // expected-note@-5 {{in implicit initialization of array element 1 with omitted initializer}} 105 #endif 106 107 TooFewError too_few_error2[2] = { 1 }; // expected-error{{no matching constructor}} 108 109 NoDefaultConstructor too_few_error3[3] = { }; // expected-error {{no matching constructor}} expected-note {{implicit initialization of array element 0}} 110 111 // C++ [dcl.init.aggr]p8 112 struct Empty { }; 113 struct EmptyTest { 114 Empty s; 115 int i; 116 } empty_test = { { }, 3 }; 117 118 EmptyTest empty_test2 = { 3 }; // expected-error{{initializer for aggregate with no elements requires explicit braces}} 119 120 struct NonEmpty { 121 int a; 122 Empty empty; 123 }; 124 struct NonEmptyTest { 125 NonEmpty a, b; 126 } non_empty_test = { { }, { } }; 127 128 // C++ [dcl.init.aggr]p9 129 struct HasReference { 130 int i; 131 int &j; // expected-note{{uninitialized reference member is here}} 132 }; 133 int global_int; 134 HasReference r1 = { 1, global_int }; 135 HasReference r2 = { 1 } ; // expected-error{{reference member of type 'int &' uninitialized}} 136 137 // C++ [dcl.init.aggr]p10 138 // Note: the behavior here is identical to C 139 int xs[2][2] = { 3, 1, 4, 2 }; 140 float y[4][3] = { { 1 }, { 2 }, { 3 }, { 4 } }; 141 142 // C++ [dcl.init.aggr]p11 143 // Note: the behavior here is identical to C 144 float y2[4][3] = { { 1, 3, 5 }, { 2, 4, 6 }, { 3, 5, 7 } }; 145 float same_as_y2[4][3] = { 1, 3, 5, 2, 4, 6, 3, 5, 7 }; 146 147 // C++ [dcl.init.aggr]p12 148 struct A2 { 149 int i; 150 operator int *(); 151 }; 152 struct B2 { 153 A2 a1, a2; 154 int *z; 155 }; 156 struct C2 { 157 operator A2(); 158 }; 159 struct D2 { 160 operator int(); 161 }; 162 A2 a2; 163 C2 c2; 164 D2 d2; 165 B2 b2 = { 4, a2, a2 }; 166 B2 b2_2 = { 4, d2, 0 }; 167 B2 b2_3 = { c2, a2, a2 }; 168 169 // C++ [dcl.init.aggr]p15: 170 union u { int a; char* b; }; // expected-note{{candidate constructor (the implicit copy constructor)}} 171 #if __cplusplus >= 201103L 172 // expected-note@-2 {{candidate constructor (the implicit move constructor)}} 173 #endif 174 175 u u1 = { 1 }; 176 u u2 = u1; 177 u u3 = 1; // expected-error{{no viable conversion}} 178 u u4 = { 0, "asdf" }; // expected-error{{excess elements in union initializer}} 179 u u5 = { "asdf" }; // expected-error{{cannot initialize a member subobject of type 'int' with an lvalue of type 'const char [5]'}} 180