|  | // RUN: %clang_cc1 -Wreorder -fsyntax-only -verify %s | 
|  | // RUN: %clang_cc1 -Wreorder -fsyntax-only -verify -std=c++98 %s | 
|  | // RUN: %clang_cc1 -Wreorder -fsyntax-only -verify -std=c++11 %s | 
|  |  | 
|  | class A { | 
|  | int m; | 
|  | public: | 
|  | 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 {  // expected-warning{{direct base 'B' is inaccessible due to ambiguity:\n    class E -> D -> C -> B\n    class E -> B}} | 
|  | public: | 
|  | E() : B(), D() { } // expected-error{{base class initializer '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 '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), // expected-note {{previous initialization is here}} | 
|  | p(0), // expected-error {{initializing multiple members of union}} | 
|  | d(1.0)  {} | 
|  | }; | 
|  |  | 
|  | struct V {}; | 
|  | struct Base {}; | 
|  | struct Base1 {}; | 
|  |  | 
|  | struct Derived : Base, Base1, virtual V { | 
|  | Derived (); | 
|  | }; | 
|  |  | 
|  | struct Current : Derived { | 
|  | int Derived; | 
|  | Current() : Derived(1), ::Derived(), // expected-warning {{initializer order does not match the declaration order}} \ | 
|  | // expected-note {{field 'Derived' will be initialized after base '::Derived'}} \ | 
|  | // expected-note {{base class '::Derived' will be initialized after base 'Derived::V'}} | 
|  | ::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(), | 
|  | ::NonExisting(),      // expected-error {{member initializer 'NonExisting' does not name a non-static data member or}} | 
|  | INT::NonExisting() {} // expected-error {{'INT' (aka 'int') is not a class, namespace, or enumeration}} \ | 
|  | // expected-error {{member initializer 'NonExisting' does not name a non-static data member or}} | 
|  | }; | 
|  |  | 
|  | struct M {              // expected-note 2 {{candidate constructor (the implicit copy constructor)}} | 
|  | #if __cplusplus >= 201103L // C++11 or later | 
|  | // expected-note@-2 2 {{candidate constructor (the implicit move constructor) not viable}} | 
|  | #endif | 
|  | // expected-note@-4 2 {{'M' declared here}} | 
|  | M(int i, int j);      // expected-note 2 {{candidate constructor}} | 
|  | }; | 
|  |  | 
|  | 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 'M'}} | 
|  | M m1; | 
|  | }; | 
|  |  | 
|  | struct P : M  { | 
|  | P()  {  } // expected-error {{constructor for 'P' must explicitly initialize the base class 'M' which does not have a default constructor}} \ | 
|  | // expected-error {{member 'm'}} | 
|  | M m; // expected-note {{member is declared here}} | 
|  | }; | 
|  |  | 
|  | struct Q { | 
|  | Q() : f1(1,2),       // expected-error {{excess elements in scalar initializer}} | 
|  | pf(0.0)  { }   // expected-error {{cannot initialize a member subobject of type 'float *' with an rvalue of type 'double'}} | 
|  | float f1; | 
|  |  | 
|  | float *pf; | 
|  | }; | 
|  |  | 
|  | // A silly class used to demonstrate field-is-uninitialized in constructors with | 
|  | // multiple params. | 
|  | int IntParam(int i) { return 0; }; | 
|  | class TwoInOne { public: TwoInOne(TwoInOne a, TwoInOne b) {} }; | 
|  | class InitializeUsingSelfTest { | 
|  | bool A; | 
|  | char* B; | 
|  | int C; | 
|  | TwoInOne D; | 
|  | int E; | 
|  | InitializeUsingSelfTest(int F) | 
|  | : A(A),  // expected-warning {{field 'A' is uninitialized when used here}} | 
|  | B((((B)))),  // expected-warning {{field 'B' is uninitialized when used here}} | 
|  | C(A && InitializeUsingSelfTest::C),  // expected-warning {{field 'C' is uninitialized when used here}} | 
|  | D(D,  // expected-warning {{field 'D' is uninitialized when used here}} | 
|  | D), // expected-warning {{field 'D' is uninitialized when used here}} | 
|  | E(IntParam(E)) {} // expected-warning {{field 'E' is uninitialized when used here}} | 
|  | }; | 
|  |  | 
|  | int IntWrapper(int &i) { return 0; }; | 
|  | class InitializeUsingSelfExceptions { | 
|  | int A; | 
|  | int B; | 
|  | int C; | 
|  | void *P; | 
|  | InitializeUsingSelfExceptions(int B) | 
|  | : A(IntWrapper(A)),  // Due to a conservative implementation, we do not report warnings inside function/ctor calls even though it is possible to do so. | 
|  | B(B),  // Not a warning; B is a local variable. | 
|  | C(sizeof(C)),  // sizeof doesn't reference contents, do not warn | 
|  | P(&P) {} // address-of doesn't reference contents (the pointer may be dereferenced in the same expression but it would be rare; and weird) | 
|  | }; | 
|  |  | 
|  | class CopyConstructorTest { | 
|  | bool A, B, C; | 
|  | CopyConstructorTest(const CopyConstructorTest& rhs) | 
|  | : A(rhs.A), | 
|  | B(B),  // expected-warning {{field 'B' is uninitialized when used here}} | 
|  | C(rhs.C || C) { }  // expected-warning {{field 'C' is uninitialized when used here}} | 
|  | }; | 
|  |  | 
|  | // Make sure we aren't marking default constructors when we shouldn't be. | 
|  | template<typename T> | 
|  | struct NDC { | 
|  | T &ref; | 
|  |  | 
|  | NDC() { } | 
|  | NDC(T &ref) : ref(ref) { } | 
|  | }; | 
|  |  | 
|  | struct X0 : NDC<int> { | 
|  | X0(int &ref) : NDC<int>(ref), ndc(ref) { } | 
|  |  | 
|  | NDC<int> ndc; | 
|  | }; | 
|  |  | 
|  | namespace Test0 { | 
|  |  | 
|  | struct A { A(); }; | 
|  |  | 
|  | struct B { | 
|  | B() { } | 
|  | const A a; | 
|  | }; | 
|  |  | 
|  | } | 
|  |  | 
|  | namespace Test1 { | 
|  | struct A { | 
|  | enum Kind { Foo } Kind; | 
|  | A() : Kind(Foo) {} | 
|  | }; | 
|  | } | 
|  |  | 
|  | namespace Test2 { | 
|  |  | 
|  | struct A { | 
|  | A(const A&); | 
|  | }; | 
|  |  | 
|  | struct B : virtual A { }; | 
|  |  | 
|  | struct C : A, B { }; // expected-warning{{direct base 'A' is inaccessible due to ambiguity:\n    struct Test2::C -> A\n    struct Test2::C -> B -> A}} | 
|  |  | 
|  | C f(C c) { | 
|  | return c; | 
|  | } | 
|  |  | 
|  | } | 
|  |  | 
|  | // Don't build implicit initializers for anonymous union fields when we already | 
|  | // have an explicit initializer for another field in the union. | 
|  | namespace PR7402 { | 
|  | struct S { | 
|  | union { | 
|  | void* ptr_; | 
|  | struct { int i_; }; | 
|  | }; | 
|  |  | 
|  | template <typename T> S(T) : ptr_(0) { } | 
|  | }; | 
|  |  | 
|  | void f() { | 
|  | S s(3); | 
|  | } | 
|  | } | 
|  |  | 
|  | // Don't crash. Lots of questionable recovery here;  errors can change. | 
|  | namespace test3 { | 
|  | class A : public std::exception {}; // expected-error {{undeclared identifier}} expected-error {{expected class name}} | 
|  | // expected-note@-1 {{candidate constructor (the implicit copy constructor) not viable}} | 
|  | #if __cplusplus >= 201103L // C++11 or later | 
|  | // expected-note@-3 {{candidate constructor (the implicit move constructor) not viable}} | 
|  | #endif | 
|  | // expected-note@-5 {{candidate constructor (the implicit default constructor) not viable}} | 
|  |  | 
|  | class B : public A { | 
|  | public: | 
|  | B(const String& s, int e=0) // expected-error {{unknown type name}} | 
|  | : A(e), m_String(s) , m_ErrorStr(__null) {} // expected-error {{no matching constructor}} \ | 
|  | expected-error {{member initializer 'm_String' does not name}} \ | 
|  | expected-error {{member initializer 'm_ErrorStr' does not name}} | 
|  | B(const B& e) | 
|  | : A(e), m_String(e.m_String), m_ErrorStr(__null) { // expected-error 2{{does not name}} \ | 
|  | // expected-error {{no member named 'm_String' in 'test3::B'}} | 
|  | } | 
|  | }; | 
|  | } | 
|  |  | 
|  | // PR8075 | 
|  | namespace PR8075 { | 
|  |  | 
|  | struct S1 { | 
|  | enum { FOO = 42 }; | 
|  | static const int bar = 42; | 
|  | static int baz(); | 
|  | S1(int); | 
|  | }; | 
|  |  | 
|  | const int S1::bar; | 
|  |  | 
|  | struct S2 { | 
|  | S1 s1; | 
|  | S2() : s1(s1.FOO) {} | 
|  | }; | 
|  |  | 
|  | struct S3 { | 
|  | S1 s1; | 
|  | S3() : s1(s1.bar) {} | 
|  | }; | 
|  |  | 
|  | struct S4 { | 
|  | S1 s1; | 
|  | S4() : s1(s1.baz()) {} | 
|  | }; | 
|  |  | 
|  | } | 
|  |  | 
|  | namespace PR12049 { | 
|  | int function(); | 
|  |  | 
|  | class Class | 
|  | { | 
|  | public: | 
|  | Class() : member(function() {} // expected-note {{to match this '('}} | 
|  |  | 
|  | int member; // expected-error {{expected ')'}} | 
|  | }; | 
|  | } | 
|  |  | 
|  | namespace PR14073 { | 
|  | struct S1 { union { int n; }; S1() : n(n) {} };  // expected-warning {{field 'n' is uninitialized when used here}} | 
|  | struct S2 { union { union { int n; }; char c; }; S2() : n(n) {} };  // expected-warning {{field 'n' is uninitialized when used here}} | 
|  | struct S3 { struct { int n; }; S3() : n(n) {} };  // expected-warning {{field 'n' is uninitialized when used here}} | 
|  | } | 
|  |  | 
|  | namespace PR10758 { | 
|  | struct A; | 
|  | struct B { | 
|  | B (A const &); // expected-note 2 {{candidate constructor not viable: no known conversion from 'const B' to 'const A &' for 1st argument}} | 
|  | B (B &); // expected-note 2 {{candidate constructor not viable: 1st argument ('const B') would lose const qualifier}} | 
|  | }; | 
|  | struct A { | 
|  | A (B); // expected-note 2 {{passing argument to parameter here}} | 
|  | }; | 
|  |  | 
|  | B f(B const &b) { | 
|  | return b; // expected-error {{no matching constructor for initialization of 'B'}} | 
|  | } | 
|  |  | 
|  | A f2(const B &b) { | 
|  | return b; // expected-error {{no matching constructor for initialization of 'B'}} | 
|  | } | 
|  | } |