1 // RUN: %clang_cc1 -fsyntax-only -pedantic -verify %s
2 // C++ [dcl.init.aggr]p2
9 } a1 = { 1, { 2, 3 } };
16 NonAggregate non_aggregate_test = { 1, 2 }; // expected-error{{non-aggregate type 'NonAggregate' cannot be initialized with an initializer list}}
18 NonAggregate non_aggregate_test2[2] = { { 1, 2 }, { 3, 4 } }; // expected-error 2 {{initialization of non-aggregate type 'NonAggregate' with an initializer list}}
21 // C++ [dcl.init.aggr]p3
24 // C++ [dcl.init.aggr]p4
25 int x[] = { 1, 3, 5 };
26 int x_sizecheck[(sizeof(x) / sizeof(int)) == 3? 1 : -1];
27 int x2[] = { }; // expected-warning{{zero size arrays are an extension}}
29 // C++ [dcl.init.aggr]p5
30 struct StaticMemberTest {
34 } smt = { 1, &smt.i };
36 // C++ [dcl.init.aggr]p6
37 char cv[4] = { 'a', 's', 'd', 'f', 0 }; // expected-error{{excess elements in array initializer}}
39 // C++ [dcl.init.aggr]p7
40 struct TooFew { int a; char* b; int c; };
41 TooFew too_few = { 1, "asdf" }; // expected-warning{{conversion from string literal to 'char *' is deprecated}}
43 struct NoDefaultConstructor { // expected-note 3 {{candidate constructor (the implicit copy constructor)}} \
44 // expected-note{{declared here}}
45 NoDefaultConstructor(int); // expected-note 3 {{candidate constructor}}
47 struct TooFewError { // expected-error{{implicit default constructor for}}
49 NoDefaultConstructor nodef; // expected-note{{member is declared here}}
51 TooFewError too_few_okay = { 1, 1 };
52 TooFewError too_few_error = { 1 }; // expected-error{{no matching constructor}}
54 TooFewError too_few_okay2[2] = { 1, 1 }; // expected-note{{implicit default constructor for 'TooFewError' first required here}}
55 TooFewError too_few_error2[2] = { 1 }; // expected-error{{no matching constructor}}
57 NoDefaultConstructor too_few_error3[3] = { }; // expected-error {{no matching constructor}}
59 // C++ [dcl.init.aggr]p8
64 } empty_test = { { }, 3 };
66 EmptyTest empty_test2 = { 3 }; // expected-error{{initializer for aggregate with no elements requires explicit braces}}
74 } non_empty_test = { { }, { } };
76 // C++ [dcl.init.aggr]p9
79 int &j; // expected-note{{uninitialized reference member is here}}
82 HasReference r1 = { 1, global_int };
83 HasReference r2 = { 1 } ; // expected-error{{initialization leaves reference member of type 'int &' uninitialized}}
85 // C++ [dcl.init.aggr]p10
86 // Note: the behavior here is identical to C
87 int xs[2][2] = { 3, 1, 4, 2 };
88 float y[4][3] = { { 1 }, { 2 }, { 3 }, { 4 } };
90 // C++ [dcl.init.aggr]p11
91 // Note: the behavior here is identical to C
92 float y2[4][3] = { { 1, 3, 5 }, { 2, 4, 6 }, { 3, 5, 7 } };
93 float same_as_y2[4][3] = { 1, 3, 5, 2, 4, 6, 3, 5, 7 };
95 // C++ [dcl.init.aggr]p12
113 B2 b2 = { 4, a2, a2 };
114 B2 b2_2 = { 4, d2, 0 };
115 B2 b2_3 = { c2, a2, a2 };
117 // C++ [dcl.init.aggr]p15:
118 union u { int a; char* b; }; // expected-note{{candidate constructor (the implicit copy constructor)}}
121 u u3 = 1; // expected-error{{no viable conversion}}
122 u u4 = { 0, "asdf" }; // expected-error{{excess elements in union initializer}}
123 u u5 = { "asdf" }; // expected-error{{cannot initialize a member subobject of type 'int' with an lvalue of type 'char const [5]'}}