xref: /llvm-project/clang/test/SemaCXX/constructor-initializer.cpp (revision 341583c3acdd7d230fd74d3660d2faff7ea81ddf)
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 };
6 
7 class B : public A {
8 public:
9   B() : A(), m(1), n(3.14) { }
10 
11 private:
12   int m;
13   float n;
14 };
15 
16 
17 class C : public virtual B {
18 public:
19   C() : B() { }
20 };
21 
22 class D : public C {
23 public:
24   D() : B(), C() { }
25 };
26 
27 class E : public D, public B {
28 public:
29   E() : B(), D() { } // expected-error{{base class initializer 'B' names both a direct base class and an inherited virtual base class}}
30 };
31 
32 
33 typedef int INT;
34 
35 class F : public B {
36 public:
37   int B;
38 
39   F() : B(17),
40         m(17), // expected-error{{member initializer 'm' does not name a non-static data member or base class}}
41         INT(17) // expected-error{{constructor initializer 'INT' (aka 'int') does not name a class}}
42   {
43   }
44 };
45 
46 class G : A {
47   G() : A(10); // expected-error{{expected '{'}}
48 };
49 
50 void f() : a(242) { } // expected-error{{only constructors take base initializers}}
51 
52 class H : A {
53   H();
54 };
55 
56 H::H() : A(10) { }
57 
58 
59 class  X {};
60 class Y {};
61 
62 struct S : Y, virtual X {
63   S ();
64 };
65 
66 struct Z : S {
67   Z() : X(), S(), E()  {} // expected-error {{type 'class E' is not a direct or virtual base of 'Z'}}
68 };
69 
70 class U {
71   union { int a; char* p; };
72   union { int b; double d; };
73 
74   U() :  a(1), p(0), d(1.0)  {} // expected-error {{multiple initializations given for non-static member 'p'}} \
75                         // expected-note {{previous initialization is here}}
76 };
77 
78 struct V {};
79 struct Base {};
80 struct Base1 {};
81 
82 struct Derived : Base, Base1, virtual V {
83   Derived ();
84 };
85 
86 struct Current : Derived {
87   int Derived;
88   Current() : Derived(1), ::Derived(), // expected-warning {{member 'Derived' will be initialized after}} \
89                                        // expected-note {{base '::Derived'}} \
90                                        // expected-warning {{base class '::Derived' will be initialized after}}
91                           ::Derived::Base(), // expected-error {{type '::Derived::Base' is not a direct or virtual base of 'Current'}}
92                            Derived::Base1(), // expected-error {{type 'Derived::Base1' is not a direct or virtual base of 'Current'}}
93                            Derived::V(), // expected-note {{base 'Derived::V'}}
94                            ::NonExisting(), // expected-error {{member initializer 'NonExisting' does not name a non-static data member or}}
95                            INT::NonExisting()  {} // expected-error {{expected a class or namespace}} \
96 						  // expected-error {{member initializer 'NonExisting' does not name a non-static data member or}}
97 };
98