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