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 5struct A { 6 int x; 7 struct B { 8 int i; 9 int j; 10 } b; 11} a1 = { 1, { 2, 3 } }; 12 13struct 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}; 24NonAggregate 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 31NonAggregate 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 39A a_init = A(); 40 41// C++ [dcl.init.aggr]p4 42int x[] = { 1, 3, 5 }; 43int x_sizecheck[(sizeof(x) / sizeof(int)) == 3? 1 : -1]; 44int x2[] = { }; // expected-warning{{zero size arrays are an extension}} 45 46// C++ [dcl.init.aggr]p5 47struct StaticMemberTest { 48 int i; 49 static int s; 50 int *j; 51} smt = { 1, &smt.i }; 52 53// C++ [dcl.init.aggr]p6 54char cv[4] = { 'a', 's', 'd', 'f', 0 }; // expected-error{{excess elements in array initializer}} 55 56// C++ [dcl.init.aggr]p7 57struct TooFew { int a; char* b; int c; }; 58TooFew 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 65struct 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}; 82struct 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}; 96TooFewError too_few_okay = { 1, 1 }; 97TooFewError too_few_error = { 1 }; // expected-error{{no matching constructor}} 98 99TooFewError 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 107TooFewError too_few_error2[2] = { 1 }; // expected-error{{no matching constructor}} 108 109NoDefaultConstructor too_few_error3[3] = { }; // expected-error {{no matching constructor}} expected-note {{implicit initialization of array element 0}} 110 111// C++ [dcl.init.aggr]p8 112struct Empty { }; 113struct EmptyTest { 114 Empty s; 115 int i; 116} empty_test = { { }, 3 }; 117 118EmptyTest empty_test2 = { 3 }; // expected-error{{initializer for aggregate with no elements requires explicit braces}} 119 120struct NonEmpty { 121 int a; 122 Empty empty; 123}; 124struct NonEmptyTest { 125 NonEmpty a, b; 126} non_empty_test = { { }, { } }; 127 128// C++ [dcl.init.aggr]p9 129struct HasReference { 130 int i; 131 int &j; // expected-note{{uninitialized reference member is here}} 132}; 133int global_int; 134HasReference r1 = { 1, global_int }; 135HasReference 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 139int xs[2][2] = { 3, 1, 4, 2 }; 140float y[4][3] = { { 1 }, { 2 }, { 3 }, { 4 } }; 141 142// C++ [dcl.init.aggr]p11 143// Note: the behavior here is identical to C 144float y2[4][3] = { { 1, 3, 5 }, { 2, 4, 6 }, { 3, 5, 7 } }; 145float same_as_y2[4][3] = { 1, 3, 5, 2, 4, 6, 3, 5, 7 }; 146 147// C++ [dcl.init.aggr]p12 148struct A2 { 149 int i; 150 operator int *(); 151}; 152struct B2 { 153 A2 a1, a2; 154 int *z; 155}; 156struct C2 { 157 operator A2(); 158}; 159struct D2 { 160 operator int(); 161}; 162A2 a2; 163C2 c2; 164D2 d2; 165B2 b2 = { 4, a2, a2 }; 166B2 b2_2 = { 4, d2, 0 }; 167B2 b2_3 = { c2, a2, a2 }; 168 169// C++ [dcl.init.aggr]p15: 170union 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 175u u1 = { 1 }; 176u u2 = u1; 177u u3 = 1; // expected-error{{no viable conversion}} 178u u4 = { 0, "asdf" }; // expected-error{{excess elements in union initializer}} 179u u5 = { "asdf" }; // expected-error{{cannot initialize a member subobject of type 'int' with an lvalue of type 'const char [5]'}} 180