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