blob: ecbe7bf5b9edd28ebb89c77310b3bffbf2020ccc [file] [log] [blame]
Daniel Dunbara5728872009-12-15 20:14:24 +00001// RUN: %clang_cc1 -Wreorder -fsyntax-only -verify %s
Douglas Gregor7ad83902008-11-05 04:29:56 +00002class A {
3 int m;
John McCall7002f4c2010-04-09 19:03:51 +00004public:
Fariborz Jahanianbcfad542009-06-30 23:26:25 +00005 A() : A::m(17) { } // expected-error {{member initializer 'm' does not name a non-static data member or base class}}
Fariborz Jahaniand7b27e12009-07-23 00:42:24 +00006 A(int);
Douglas Gregor7ad83902008-11-05 04:29:56 +00007};
8
9class B : public A {
10public:
11 B() : A(), m(1), n(3.14) { }
12
13private:
14 int m;
15 float n;
16};
17
18
19class C : public virtual B {
20public:
21 C() : B() { }
22};
23
24class D : public C {
25public:
26 D() : B(), C() { }
27};
28
29class E : public D, public B {
30public:
John McCall7c2342d2010-03-10 11:27:22 +000031 E() : B(), D() { } // expected-error{{base class initializer 'B' names both a direct base class and an inherited virtual base class}}
Douglas Gregor7ad83902008-11-05 04:29:56 +000032};
33
34
35typedef int INT;
36
37class F : public B {
38public:
39 int B;
40
41 F() : B(17),
42 m(17), // expected-error{{member initializer 'm' does not name a non-static data member or base class}}
Chris Lattnerd0344a42009-02-19 23:45:49 +000043 INT(17) // expected-error{{constructor initializer 'INT' (aka 'int') does not name a class}}
Douglas Gregor7ad83902008-11-05 04:29:56 +000044 {
45 }
46};
Douglas Gregor3f08d182008-11-10 16:59:40 +000047
48class G : A {
49 G() : A(10); // expected-error{{expected '{'}}
50};
Anders Carlssona7b35212009-03-25 02:58:17 +000051
52void f() : a(242) { } // expected-error{{only constructors take base initializers}}
53
54class H : A {
55 H();
56};
57
58H::H() : A(10) { }
59
Fariborz Jahanian9da72012009-06-30 17:34:52 +000060
61class X {};
62class Y {};
63
64struct S : Y, virtual X {
65 S ();
66};
67
68struct Z : S {
John McCall7c2342d2010-03-10 11:27:22 +000069 Z() : X(), S(), E() {} // expected-error {{type 'E' is not a direct or virtual base of 'Z'}}
Fariborz Jahanian9da72012009-06-30 17:34:52 +000070};
71
Fariborz Jahanian5ac3dfc2009-06-30 21:52:59 +000072class U {
73 union { int a; char* p; };
74 union { int b; double d; };
75
John McCall3c3ccdb2010-04-10 09:28:51 +000076 U() : a(1), // expected-note {{previous initialization is here}}
David Blaikie6fe29652011-11-17 06:01:57 +000077 p(0), // expected-error {{initializing multiple members of union}}
John McCall3c3ccdb2010-04-10 09:28:51 +000078 d(1.0) {}
Fariborz Jahanian5ac3dfc2009-06-30 21:52:59 +000079};
80
Fariborz Jahanianbcfad542009-06-30 23:26:25 +000081struct V {};
82struct Base {};
83struct Base1 {};
84
85struct Derived : Base, Base1, virtual V {
86 Derived ();
87};
88
89struct Current : Derived {
90 int Derived;
John McCalld6ca8da2010-04-10 07:37:23 +000091 Current() : Derived(1), ::Derived(), // expected-warning {{field 'Derived' will be initialized after base '::Derived'}} \
92 // expected-warning {{base class '::Derived' will be initialized after base 'Derived::V'}}
Fariborz Jahanianbcfad542009-06-30 23:26:25 +000093 ::Derived::Base(), // expected-error {{type '::Derived::Base' is not a direct or virtual base of 'Current'}}
94 Derived::Base1(), // expected-error {{type 'Derived::Base1' is not a direct or virtual base of 'Current'}}
John McCalld6ca8da2010-04-10 07:37:23 +000095 Derived::V(),
Fariborz Jahanianbcfad542009-06-30 23:26:25 +000096 ::NonExisting(), // expected-error {{member initializer 'NonExisting' does not name a non-static data member or}}
97 INT::NonExisting() {} // expected-error {{expected a class or namespace}} \
Mike Stump1eb44332009-09-09 15:08:12 +000098 // expected-error {{member initializer 'NonExisting' does not name a non-static data member or}}
Fariborz Jahanianbcfad542009-06-30 23:26:25 +000099};
Fariborz Jahanian87595e42009-07-23 23:32:59 +0000100
John McCall220ccbf2010-01-13 00:25:19 +0000101struct M { // expected-note 2 {{candidate constructor (the implicit copy constructor)}} \
Eli Friedman49c16da2009-11-09 01:05:47 +0000102 // expected-note {{declared here}} \
103 // expected-note {{declared here}}
John McCallb1622a12010-01-06 09:43:14 +0000104 M(int i, int j); // expected-note 2 {{candidate constructor}}
Fariborz Jahanian87595e42009-07-23 23:32:59 +0000105};
106
107struct N : M {
John McCall7c2342d2010-03-10 11:27:22 +0000108 N() : M(1), // expected-error {{no matching constructor for initialization of 'M'}}
109 m1(100) { } // expected-error {{no matching constructor for initialization of 'M'}}
Fariborz Jahanian87595e42009-07-23 23:32:59 +0000110 M m1;
111};
112
Eli Friedman49c16da2009-11-09 01:05:47 +0000113struct P : M {
John McCall7c2342d2010-03-10 11:27:22 +0000114 P() { } // expected-error {{constructor for 'P' must explicitly initialize the base class 'M' which does not have a default constructor}} \
Eli Friedman49c16da2009-11-09 01:05:47 +0000115 // expected-error {{member 'm'}}
116 M m; // expected-note {{member is declared here}}
Fariborz Jahanian87595e42009-07-23 23:32:59 +0000117};
118
Fariborz Jahanian7252f512009-07-24 20:28:49 +0000119struct Q {
Douglas Gregor9db7dbb2010-01-31 09:12:51 +0000120 Q() : f1(1,2), // expected-error {{excess elements in scalar initializer}}
121 pf(0.0) { } // expected-error {{cannot initialize a member subobject of type 'float *' with an rvalue of type 'double'}}
Fariborz Jahanian7252f512009-07-24 20:28:49 +0000122 float f1;
123
124 float *pf;
125};
John McCallb4190042009-11-04 23:02:40 +0000126
127// A silly class used to demonstrate field-is-uninitialized in constructors with
128// multiple params.
Richard Trieude5e75c2012-06-14 23:11:34 +0000129int IntParam(int i) { return 0; };
John McCall7002f4c2010-04-09 19:03:51 +0000130class TwoInOne { public: TwoInOne(TwoInOne a, TwoInOne b) {} };
John McCallb4190042009-11-04 23:02:40 +0000131class InitializeUsingSelfTest {
132 bool A;
133 char* B;
134 int C;
135 TwoInOne D;
Richard Trieude5e75c2012-06-14 23:11:34 +0000136 int E;
137 InitializeUsingSelfTest(int F)
Hans Wennborg7821e072012-09-21 08:58:33 +0000138 : A(A), // expected-warning {{field 'A' is uninitialized when used here}}
139 B((((B)))), // expected-warning {{field 'B' is uninitialized when used here}}
140 C(A && InitializeUsingSelfTest::C), // expected-warning {{field 'C' is uninitialized when used here}}
141 D(D, // expected-warning {{field 'D' is uninitialized when used here}}
142 D), // expected-warning {{field 'D' is uninitialized when used here}}
143 E(IntParam(E)) {} // expected-warning {{field 'E' is uninitialized when used here}}
John McCallb4190042009-11-04 23:02:40 +0000144};
145
Richard Trieude5e75c2012-06-14 23:11:34 +0000146int IntWrapper(int &i) { return 0; };
John McCallb4190042009-11-04 23:02:40 +0000147class InitializeUsingSelfExceptions {
148 int A;
149 int B;
Argyrios Kyrtzidisff8819b2010-09-21 10:47:20 +0000150 int C;
151 void *P;
John McCallb4190042009-11-04 23:02:40 +0000152 InitializeUsingSelfExceptions(int B)
153 : A(IntWrapper(A)), // Due to a conservative implementation, we do not report warnings inside function/ctor calls even though it is possible to do so.
Argyrios Kyrtzidisff8819b2010-09-21 10:47:20 +0000154 B(B), // Not a warning; B is a local variable.
155 C(sizeof(C)), // sizeof doesn't reference contents, do not warn
156 P(&P) {} // address-of doesn't reference contents (the pointer may be dereferenced in the same expression but it would be rare; and weird)
John McCallb4190042009-11-04 23:02:40 +0000157};
158
159class CopyConstructorTest {
160 bool A, B, C;
161 CopyConstructorTest(const CopyConstructorTest& rhs)
162 : A(rhs.A),
Hans Wennborg7821e072012-09-21 08:58:33 +0000163 B(B), // expected-warning {{field 'B' is uninitialized when used here}}
164 C(rhs.C || C) { } // expected-warning {{field 'C' is uninitialized when used here}}
John McCallb4190042009-11-04 23:02:40 +0000165};
Douglas Gregorc07a4942009-11-15 08:51:10 +0000166
167// Make sure we aren't marking default constructors when we shouldn't be.
168template<typename T>
169struct NDC {
170 T &ref;
171
172 NDC() { }
173 NDC(T &ref) : ref(ref) { }
174};
175
176struct X0 : NDC<int> {
177 X0(int &ref) : NDC<int>(ref), ndc(ref) { }
178
179 NDC<int> ndc;
180};
Anders Carlsson114a2972010-04-23 03:07:47 +0000181
182namespace Test0 {
183
184struct A { A(); };
185
186struct B {
187 B() { }
188 const A a;
189};
190
191}
John McCall0d6b1642010-04-23 18:46:30 +0000192
Anders Carlsson9fd682b2010-04-25 01:00:05 +0000193namespace Test1 {
John McCall0d6b1642010-04-23 18:46:30 +0000194 struct A {
195 enum Kind { Foo } Kind;
196 A() : Kind(Foo) {}
197 };
198}
Anders Carlsson9fd682b2010-04-25 01:00:05 +0000199
200namespace Test2 {
201
202struct A {
203 A(const A&);
204};
205
206struct B : virtual A { };
207struct C : A, B { };
208
209C f(C c) {
210 return c;
211}
212
213}
Chandler Carruthe861c602010-06-30 02:59:29 +0000214
215// Don't build implicit initializers for anonymous union fields when we already
216// have an explicit initializer for another field in the union.
217namespace PR7402 {
218 struct S {
219 union {
220 void* ptr_;
221 struct { int i_; };
222 };
223
224 template <typename T> S(T) : ptr_(0) { }
225 };
226
227 void f() {
228 S s(3);
229 }
230}
John McCall572fc622010-08-17 07:23:57 +0000231
232// <rdar://problem/8308215>: don't crash.
233// Lots of questionable recovery here; errors can change.
234namespace test3 {
Eli Friedman06808f12012-08-08 04:39:56 +0000235 class A : public std::exception {}; // expected-error {{undeclared identifier}} expected-error {{expected class name}} expected-note 2 {{candidate}}
John McCall572fc622010-08-17 07:23:57 +0000236 class B : public A {
237 public:
238 B(const String& s, int e=0) // expected-error {{unknown type name}}
239 : A(e), m_String(s) , m_ErrorStr(__null) {} // expected-error {{no matching constructor}} expected-error {{does not name}}
240 B(const B& e)
Eli Friedman06808f12012-08-08 04:39:56 +0000241 : A(e), m_String(e.m_String), m_ErrorStr(__null) { // expected-error {{does not name}} expected-error {{no member named 'm_String' in 'test3::B'}}
John McCall572fc622010-08-17 07:23:57 +0000242 }
243 };
244}
Anders Carlsson175ffbf2010-10-06 02:43:25 +0000245
246// PR8075
247namespace PR8075 {
248
249struct S1 {
250 enum { FOO = 42 };
251 static const int bar = 42;
252 static int baz();
253 S1(int);
254};
255
256const int S1::bar;
257
258struct S2 {
259 S1 s1;
260 S2() : s1(s1.FOO) {}
261};
262
263struct S3 {
264 S1 s1;
265 S3() : s1(s1.bar) {}
266};
267
268struct S4 {
269 S1 s1;
270 S4() : s1(s1.baz()) {}
271};
272
273}
Eli Friedmane9ee3822012-02-22 04:49:04 +0000274
275namespace PR12049 {
276 int function();
277
278 class Class
279 {
280 public:
281 Class() : member(function() {} // expected-note {{to match this '('}}
282
283 int member; // expected-error {{expected ')'}}
284 };
285}