blob: 2b5149cf278f9ee2248abc4809fafdde2f12ef1a [file] [log] [blame]
Daniel Dunbar8fbe78f2009-12-15 20:14:24 +00001// RUN: %clang_cc1 -fsyntax-only -pedantic -verify %s
Charles Li64a1a812016-04-13 20:00:45 +00002// RUN: %clang_cc1 -fsyntax-only -pedantic -verify -std=c++98 %s
3// RUN: %clang_cc1 -fsyntax-only -pedantic -verify -std=c++11 %s
Douglas Gregord14247a2009-01-30 22:09:00 +00004// C++ [dcl.init.aggr]p2
5struct A {
6 int x;
7 struct B {
8 int i;
9 int j;
10 } b;
11} a1 = { 1, { 2, 3 } };
12
13struct NonAggregate {
Charles Li64a1a812016-04-13 20:00:45 +000014#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
Douglas Gregord14247a2009-01-30 22:09:00 +000018 NonAggregate();
Charles Li64a1a812016-04-13 20:00:45 +000019#if __cplusplus >= 201103L
20// expected-note@-2 3 {{candidate constructor not viable: requires 0 arguments, but 2 were provided}}
21#endif
Douglas Gregord14247a2009-01-30 22:09:00 +000022 int a, b;
23};
Charles Li64a1a812016-04-13 20:00:45 +000024NonAggregate 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
Douglas Gregord14247a2009-01-30 22:09:00 +000030
Charles Li64a1a812016-04-13 20:00:45 +000031NonAggregate 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
Douglas Gregord14247a2009-01-30 22:09:00 +000037
38// C++ [dcl.init.aggr]p3
39A a_init = A();
40
41// C++ [dcl.init.aggr]p4
42int x[] = { 1, 3, 5 };
43int x_sizecheck[(sizeof(x) / sizeof(int)) == 3? 1 : -1];
44int x2[] = { }; // expected-warning{{zero size arrays are an extension}}
45
46// C++ [dcl.init.aggr]p5
47struct StaticMemberTest {
48 int i;
49 static int s;
50 int *j;
51} smt = { 1, &smt.i };
52
53// C++ [dcl.init.aggr]p6
Douglas Gregord42a0fb2009-01-30 22:26:29 +000054char cv[4] = { 'a', 's', 'd', 'f', 0 }; // expected-error{{excess elements in array initializer}}
Douglas Gregord14247a2009-01-30 22:09:00 +000055
56// C++ [dcl.init.aggr]p7
57struct TooFew { int a; char* b; int c; };
Charles Li64a1a812016-04-13 20:00:45 +000058TooFew 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
Douglas Gregord14247a2009-01-30 22:09:00 +000064
Charles Li64a1a812016-04-13 20:00:45 +000065struct 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
73
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
80
Douglas Gregora5c9e1a2009-02-02 17:43:21 +000081};
Charles Li64a1a812016-04-13 20:00:45 +000082struct TooFewError {
83#if __cplusplus <= 199711L
84// expected-error@-2 {{implicit default constructor for}}
85#endif
86
Douglas Gregora5c9e1a2009-02-02 17:43:21 +000087 int a;
Charles Li64a1a812016-04-13 20:00:45 +000088 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
Douglas Gregora5c9e1a2009-02-02 17:43:21 +000095};
96TooFewError too_few_okay = { 1, 1 };
97TooFewError too_few_error = { 1 }; // expected-error{{no matching constructor}}
98
Charles Li64a1a812016-04-13 20:00:45 +000099TooFewError 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
106
Douglas Gregora5c9e1a2009-02-02 17:43:21 +0000107TooFewError too_few_error2[2] = { 1 }; // expected-error{{no matching constructor}}
108
Richard Smith6c3bbf42014-06-03 07:28:54 +0000109NoDefaultConstructor too_few_error3[3] = { }; // expected-error {{no matching constructor}} expected-note {{implicit initialization of array element 0}}
Douglas Gregora5c9e1a2009-02-02 17:43:21 +0000110
Douglas Gregord14247a2009-01-30 22:09:00 +0000111// C++ [dcl.init.aggr]p8
112struct Empty { };
113struct EmptyTest {
114 Empty s;
115 int i;
116} empty_test = { { }, 3 };
117
118EmptyTest empty_test2 = { 3 }; // expected-error{{initializer for aggregate with no elements requires explicit braces}}
119
120struct NonEmpty {
121 int a;
122 Empty empty;
123};
124struct NonEmptyTest {
125 NonEmpty a, b;
126} non_empty_test = { { }, { } };
127
128// C++ [dcl.init.aggr]p9
129struct HasReference {
130 int i;
131 int &j; // expected-note{{uninitialized reference member is here}}
132};
133int global_int;
134HasReference r1 = { 1, global_int };
Richard Trieu553b2b22011-12-15 00:38:15 +0000135HasReference r2 = { 1 } ; // expected-error{{reference member of type 'int &' uninitialized}}
Douglas Gregord14247a2009-01-30 22:09:00 +0000136
137// C++ [dcl.init.aggr]p10
138// Note: the behavior here is identical to C
139int xs[2][2] = { 3, 1, 4, 2 };
140float y[4][3] = { { 1 }, { 2 }, { 3 }, { 4 } };
141
142// C++ [dcl.init.aggr]p11
143// Note: the behavior here is identical to C
144float y2[4][3] = { { 1, 3, 5 }, { 2, 4, 6 }, { 3, 5, 7 } };
145float same_as_y2[4][3] = { 1, 3, 5, 2, 4, 6, 3, 5, 7 };
146
147// C++ [dcl.init.aggr]p12
148struct A2 {
149 int i;
150 operator int *();
151};
152struct B2 {
153 A2 a1, a2;
154 int *z;
155};
156struct C2 {
157 operator A2();
158};
159struct D2 {
160 operator int();
161};
162A2 a2;
163C2 c2;
164D2 d2;
165B2 b2 = { 4, a2, a2 };
166B2 b2_2 = { 4, d2, 0 };
Douglas Gregor576e98c2009-01-30 23:27:23 +0000167B2 b2_3 = { c2, a2, a2 };
Douglas Gregord14247a2009-01-30 22:09:00 +0000168
169// C++ [dcl.init.aggr]p15:
John McCalle1ac8d12010-01-13 00:25:19 +0000170union u { int a; char* b; }; // expected-note{{candidate constructor (the implicit copy constructor)}}
Charles Li64a1a812016-04-13 20:00:45 +0000171#if __cplusplus >= 201103L
172// expected-note@-2 {{candidate constructor (the implicit move constructor)}}
173#endif
174
Douglas Gregord14247a2009-01-30 22:09:00 +0000175u u1 = { 1 };
176u u2 = u1;
Douglas Gregora4b592a2009-12-19 03:01:41 +0000177u u3 = 1; // expected-error{{no viable conversion}}
Douglas Gregorfc4f8a12009-02-04 22:46:25 +0000178u u4 = { 0, "asdf" }; // expected-error{{excess elements in union initializer}}
Chris Lattner53fa0492010-09-05 00:04:01 +0000179u u5 = { "asdf" }; // expected-error{{cannot initialize a member subobject of type 'int' with an lvalue of type 'const char [5]'}}