dcl_init_aggr.cpp revision b574e5630d66629ccc8f2432e60b59ae42f1f363
1// RUN: clang -fsyntax-only -pedantic -verify %s 2// C++ [dcl.init.aggr]p2 3struct A { 4 int x; 5 struct B { 6 int i; 7 int j; 8 } b; 9} a1 = { 1, { 2, 3 } }; 10 11struct NonAggregate { 12 NonAggregate(); 13 14 int a, b; 15}; 16NonAggregate non_aggregate_test = { 1, 2 }; // expected-error{{initialization of non-aggregate type 'struct NonAggregate' with an initializer list}} 17 18NonAggregate non_aggregate_test2[2] = { { 1, 2 }, { 3, 4 } }; // expected-error{{initialization of non-aggregate type 'struct NonAggregate' with an initializer list}} 19 20 21// C++ [dcl.init.aggr]p3 22A a_init = A(); 23 24// C++ [dcl.init.aggr]p4 25int x[] = { 1, 3, 5 }; 26int x_sizecheck[(sizeof(x) / sizeof(int)) == 3? 1 : -1]; 27int x2[] = { }; // expected-warning{{zero size arrays are an extension}} 28 29// C++ [dcl.init.aggr]p5 30struct StaticMemberTest { 31 int i; 32 static int s; 33 int *j; 34} smt = { 1, &smt.i }; 35 36// C++ [dcl.init.aggr]p6 37char cv[4] = { 'a', 's', 'd', 'f', 0 }; // expected-error{{excess elements in array initializer}} 38 39// C++ [dcl.init.aggr]p7 40struct TooFew { int a; char* b; int c; }; 41TooFew too_few = { 1, "asdf" }; // okay 42 43// C++ [dcl.init.aggr]p8 44struct Empty { }; 45struct EmptyTest { 46 Empty s; 47 int i; 48} empty_test = { { }, 3 }; 49 50EmptyTest empty_test2 = { 3 }; // expected-error{{initializer for aggregate with no elements requires explicit braces}} 51 52struct NonEmpty { 53 int a; 54 Empty empty; 55}; 56struct NonEmptyTest { 57 NonEmpty a, b; 58} non_empty_test = { { }, { } }; 59 60// C++ [dcl.init.aggr]p9 61struct HasReference { 62 int i; 63 int &j; // expected-note{{uninitialized reference member is here}} 64}; 65int global_int; 66HasReference r1 = { 1, global_int }; 67HasReference r2 = { 1 } ; // expected-error{{initialization leaves reference member of type 'int &' uninitialized}} 68 69// C++ [dcl.init.aggr]p10 70// Note: the behavior here is identical to C 71int xs[2][2] = { 3, 1, 4, 2 }; 72float y[4][3] = { { 1 }, { 2 }, { 3 }, { 4 } }; 73 74// C++ [dcl.init.aggr]p11 75// Note: the behavior here is identical to C 76float y2[4][3] = { { 1, 3, 5 }, { 2, 4, 6 }, { 3, 5, 7 } }; 77float same_as_y2[4][3] = { 1, 3, 5, 2, 4, 6, 3, 5, 7 }; 78 79// C++ [dcl.init.aggr]p12 80struct A2 { 81 int i; 82 operator int *(); 83}; 84struct B2 { 85 A2 a1, a2; 86 int *z; 87}; 88struct C2 { 89 operator A2(); 90}; 91struct D2 { 92 operator int(); 93}; 94A2 a2; 95C2 c2; 96D2 d2; 97B2 b2 = { 4, a2, a2 }; 98B2 b2_2 = { 4, d2, 0 }; 99// FIXME: B2 b2_3 = { c2, a2, a2 }; 100 101// C++ [dcl.init.aggr]p15: 102union u { int a; char* b; }; 103u u1 = { 1 }; 104u u2 = u1; 105u u3 = 1; // expected-error{{cannot initialize 'u3' with an rvalue of type 'int'}} 106u u4 = { 0, "asdf" }; // expected-error{{excess elements in array initializer}} 107u u5 = { "asdf" }; // expected-error{{incompatible type initializing 'char const [5]', expected 'int'}} 108