xref: /llvm-project/clang/test/SemaCXX/constructor-initializer.cpp (revision 0228bc1a41fbd2b3cfecd05d6518bb424c9c34b4)
1 // RUN: clang-cc -Wreorder -fsyntax-only -verify %s
2 class A {
3   int m;
4    A() : A::m(17) { } // expected-error {{member initializer 'm' does not name a non-static data member or base class}}
5    A(int);
6 };
7 
8 class B : public A {
9 public:
10   B() : A(), m(1), n(3.14) { }
11 
12 private:
13   int m;
14   float n;
15 };
16 
17 
18 class C : public virtual B {
19 public:
20   C() : B() { }
21 };
22 
23 class D : public C {
24 public:
25   D() : B(), C() { }
26 };
27 
28 class E : public D, public B {
29 public:
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 
34 typedef int INT;
35 
36 class F : public B {
37 public:
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}}
42         INT(17) // expected-error{{constructor initializer 'INT' (aka 'int') does not name a class}}
43   {
44   }
45 };
46 
47 class G : A {
48   G() : A(10); // expected-error{{expected '{'}}
49 };
50 
51 void f() : a(242) { } // expected-error{{only constructors take base initializers}}
52 
53 class H : A {
54   H();
55 };
56 
57 H::H() : A(10) { }
58 
59 
60 class  X {};
61 class Y {};
62 
63 struct S : Y, virtual X {
64   S ();
65 };
66 
67 struct Z : S {
68   Z() : X(), S(), E()  {} // expected-error {{type 'class E' is not a direct or virtual base of 'Z'}}
69 };
70 
71 class 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 
79 struct V {};
80 struct Base {};
81 struct Base1 {};
82 
83 struct Derived : Base, Base1, virtual V {
84   Derived ();
85 };
86 
87 struct Current : Derived {
88   int Derived;
89   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}}
92                           ::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'}}
94                            Derived::V(), // expected-note {{base 'Derived::V'}}
95                            ::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 };
99