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