blob: 71d38a1438baf9d13c333b88bb5895f1372dbddc [file] [log] [blame]
Fariborz Jahanianeb96e122009-07-09 19:59:47 +00001// RUN: clang-cc -Wreorder -fsyntax-only -verify %s
Douglas Gregor7ad83902008-11-05 04:29:56 +00002class A {
3 int m;
Fariborz Jahanianbcfad542009-06-30 23:26:25 +00004 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 +00005 A(int);
Douglas Gregor7ad83902008-11-05 04:29:56 +00006};
7
8class B : public A {
9public:
10 B() : A(), m(1), n(3.14) { }
11
12private:
13 int m;
14 float n;
15};
16
17
18class C : public virtual B {
19public:
20 C() : B() { }
21};
22
23class D : public C {
24public:
25 D() : B(), C() { }
26};
27
28class E : public D, public B {
29public:
30 E() : B(), D() { } // expected-error{{base class initializer 'B' names both a direct base class and an inherited virtual base class}}
31};
32
33
34typedef int INT;
35
36class F : public B {
37public:
38 int B;
39
40 F() : B(17),
41 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 +000042 INT(17) // expected-error{{constructor initializer 'INT' (aka 'int') does not name a class}}
Douglas Gregor7ad83902008-11-05 04:29:56 +000043 {
44 }
45};
Douglas Gregor3f08d182008-11-10 16:59:40 +000046
47class G : A {
48 G() : A(10); // expected-error{{expected '{'}}
49};
Anders Carlssona7b35212009-03-25 02:58:17 +000050
51void f() : a(242) { } // expected-error{{only constructors take base initializers}}
52
53class H : A {
54 H();
55};
56
57H::H() : A(10) { }
58
Fariborz Jahanian9da72012009-06-30 17:34:52 +000059
60class X {};
61class Y {};
62
63struct S : Y, virtual X {
64 S ();
65};
66
67struct Z : S {
Fariborz Jahanianeb96e122009-07-09 19:59:47 +000068 Z() : X(), S(), E() {} // expected-error {{type 'class E' is not a direct or virtual base of 'Z'}}
Fariborz Jahanian9da72012009-06-30 17:34:52 +000069};
70
Fariborz Jahanian5ac3dfc2009-06-30 21:52:59 +000071class U {
72 union { int a; char* p; };
73 union { int b; double d; };
74
75 U() : a(1), p(0), d(1.0) {} // expected-error {{multiple initializations given for non-static member 'p'}} \
76 // expected-note {{previous initialization is here}}
77};
78
Fariborz Jahanianbcfad542009-06-30 23:26:25 +000079struct V {};
80struct Base {};
81struct Base1 {};
82
83struct Derived : Base, Base1, virtual V {
84 Derived ();
85};
86
87struct Current : Derived {
88 int Derived;
Fariborz Jahanianeb96e122009-07-09 19:59:47 +000089 Current() : Derived(1), ::Derived(), // expected-warning {{member 'Derived' will be initialized after}} \
90 // expected-note {{base '::Derived'}} \
91 // expected-warning {{base class '::Derived' will be initialized after}}
Fariborz Jahanianbcfad542009-06-30 23:26:25 +000092 ::Derived::Base(), // expected-error {{type '::Derived::Base' is not a direct or virtual base of 'Current'}}
93 Derived::Base1(), // expected-error {{type 'Derived::Base1' is not a direct or virtual base of 'Current'}}
Fariborz Jahanianeb96e122009-07-09 19:59:47 +000094 Derived::V(), // expected-note {{base 'Derived::V'}}
Fariborz Jahanianbcfad542009-06-30 23:26:25 +000095 ::NonExisting(), // expected-error {{member initializer 'NonExisting' does not name a non-static data member or}}
96 INT::NonExisting() {} // expected-error {{expected a class or namespace}} \
97 // expected-error {{member initializer 'NonExisting' does not name a non-static data member or}}
98};
Fariborz Jahanian87595e42009-07-23 23:32:59 +000099
100 // FIXME. This is bad message!
101struct M { // expected-note {{candidate function}} \
102 // expected-note {{candidate function}}
103 M(int i, int j); // expected-note {{candidate function}} \
104 // // expected-note {{candidate function}}
105};
106
107struct N : M {
108 N() : M(1), // expected-error {{no matching constructor for initialization of 'M'}}
109 m1(100) { } // expected-error {{no matching constructor for initialization of 'm1'}}
110 M m1;
111};
112
113struct P : M { // expected-error {{default constructor for 'struct M' is missing in initialization of base class}}
114 P() { }
115 M m; // expected-error {{default constructor for 'struct M' is missing in initialization of mamber}}
116};
117
118