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