| // RUN: clang-cc -Wreorder -fsyntax-only -verify %s |
| class A { |
| int m; |
| A() : A::m(17) { } // expected-error {{member initializer 'm' does not name a non-static data member or base class}} |
| A(int); |
| }; |
| |
| class B : public A { |
| public: |
| B() : A(), m(1), n(3.14) { } |
| |
| private: |
| int m; |
| float n; |
| }; |
| |
| |
| class C : public virtual B { |
| public: |
| C() : B() { } |
| }; |
| |
| class D : public C { |
| public: |
| D() : B(), C() { } |
| }; |
| |
| class E : public D, public B { |
| public: |
| E() : B(), D() { } // expected-error{{base class initializer 'class B' names both a direct base class and an inherited virtual base class}} |
| }; |
| |
| |
| typedef int INT; |
| |
| class F : public B { |
| public: |
| int B; |
| |
| F() : B(17), |
| m(17), // expected-error{{member initializer 'm' does not name a non-static data member or base class}} |
| INT(17) // expected-error{{constructor initializer 'INT' (aka 'int') does not name a class}} |
| { |
| } |
| }; |
| |
| class G : A { |
| G() : A(10); // expected-error{{expected '{'}} |
| }; |
| |
| void f() : a(242) { } // expected-error{{only constructors take base initializers}} |
| |
| class H : A { |
| H(); |
| }; |
| |
| H::H() : A(10) { } |
| |
| |
| class X {}; |
| class Y {}; |
| |
| struct S : Y, virtual X { |
| S (); |
| }; |
| |
| struct Z : S { |
| Z() : X(), S(), E() {} // expected-error {{type 'class E' is not a direct or virtual base of 'Z'}} |
| }; |
| |
| class U { |
| union { int a; char* p; }; |
| union { int b; double d; }; |
| |
| U() : a(1), p(0), d(1.0) {} // expected-error {{multiple initializations given for non-static member 'p'}} \ |
| // expected-note {{previous initialization is here}} |
| }; |
| |
| struct V {}; |
| struct Base {}; |
| struct Base1 {}; |
| |
| struct Derived : Base, Base1, virtual V { |
| Derived (); |
| }; |
| |
| struct Current : Derived { |
| int Derived; |
| Current() : Derived(1), ::Derived(), // expected-warning {{member 'Derived' will be initialized after}} \ |
| // expected-note {{base '::Derived'}} \ |
| // expected-warning {{base class '::Derived' will be initialized after}} |
| ::Derived::Base(), // expected-error {{type '::Derived::Base' is not a direct or virtual base of 'Current'}} |
| Derived::Base1(), // expected-error {{type 'Derived::Base1' is not a direct or virtual base of 'Current'}} |
| Derived::V(), // expected-note {{base 'Derived::V'}} |
| ::NonExisting(), // expected-error {{member initializer 'NonExisting' does not name a non-static data member or}} |
| INT::NonExisting() {} // expected-error {{expected a class or namespace}} \ |
| // expected-error {{member initializer 'NonExisting' does not name a non-static data member or}} |
| }; |
| |
| // FIXME. This is bad message! |
| struct M { // expected-note {{candidate function}} \ |
| // expected-note {{candidate function}} |
| M(int i, int j); // expected-note {{candidate function}} \ |
| // // expected-note {{candidate function}} |
| }; |
| |
| struct N : M { |
| N() : M(1), // expected-error {{no matching constructor for initialization of 'M'}} |
| m1(100) { } // expected-error {{no matching constructor for initialization of 'm1'}} |
| M m1; |
| }; |
| |
| struct P : M { // expected-error {{default constructor for 'struct M' is missing in initialization of base class}} |
| P() { } |
| M m; // expected-error {{default constructor for 'struct M' is missing in initialization of member}} |
| }; |
| |
| struct Q { |
| Q() : f1(1,2), // expected-error {{Too many arguments for member initializer 'f1'}} |
| pf(0.0) { } // expected-error {{incompatible type passing 'double', expected 'float *'}} |
| float f1; |
| |
| float *pf; |
| }; |