1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -Wreorder -verify %s 2*67e74705SXin Li 3*67e74705SXin Li struct BB {}; 4*67e74705SXin Li 5*67e74705SXin Li struct BB1 {}; 6*67e74705SXin Li 7*67e74705SXin Li class complex : public BB, BB1 { 8*67e74705SXin Li public: complex()9*67e74705SXin Li complex() 10*67e74705SXin Li : s2(1), // expected-warning {{field 's2' will be initialized after field 's1'}} 11*67e74705SXin Li s1(1), 12*67e74705SXin Li s3(3), // expected-warning {{field 's3' will be initialized after base 'BB1'}} 13*67e74705SXin Li BB1(), // expected-warning {{base class 'BB1' will be initialized after base 'BB'}} 14*67e74705SXin Li BB() 15*67e74705SXin Li {} 16*67e74705SXin Li int s1; 17*67e74705SXin Li int s2; 18*67e74705SXin Li int s3; 19*67e74705SXin Li }; 20*67e74705SXin Li 21*67e74705SXin Li 22*67e74705SXin Li // testing virtual bases. 23*67e74705SXin Li 24*67e74705SXin Li 25*67e74705SXin Li struct V { 26*67e74705SXin Li V(); 27*67e74705SXin Li }; 28*67e74705SXin Li 29*67e74705SXin Li struct A : public virtual V { 30*67e74705SXin Li A(); 31*67e74705SXin Li }; 32*67e74705SXin Li 33*67e74705SXin Li struct B : public virtual V { 34*67e74705SXin Li B(); 35*67e74705SXin Li }; 36*67e74705SXin Li 37*67e74705SXin Li struct Diamond : public A, public B { DiamondDiamond38*67e74705SXin Li Diamond() : A(), B() {} 39*67e74705SXin Li }; 40*67e74705SXin Li 41*67e74705SXin Li 42*67e74705SXin Li struct C : public A, public B, private virtual V { CC43*67e74705SXin Li C() { } 44*67e74705SXin Li }; 45*67e74705SXin Li 46*67e74705SXin Li 47*67e74705SXin Li struct D : public A, public B { DD48*67e74705SXin Li D() : A(), V() { } // expected-warning {{base class 'A' will be initialized after base 'V'}} 49*67e74705SXin Li }; 50*67e74705SXin Li 51*67e74705SXin Li 52*67e74705SXin Li struct E : public A, public B, private virtual V { EE53*67e74705SXin Li E() : A(), V() { } // expected-warning {{base class 'A' will be initialized after base 'V'}} 54*67e74705SXin Li }; 55*67e74705SXin Li 56*67e74705SXin Li 57*67e74705SXin Li struct A1 { 58*67e74705SXin Li A1(); 59*67e74705SXin Li }; 60*67e74705SXin Li 61*67e74705SXin Li struct B1 { 62*67e74705SXin Li B1(); 63*67e74705SXin Li }; 64*67e74705SXin Li 65*67e74705SXin Li struct F : public A1, public B1, private virtual V { FF66*67e74705SXin Li F() : A1(), V() { } // expected-warning {{base class 'A1' will be initialized after base 'V'}} 67*67e74705SXin Li }; 68*67e74705SXin Li 69*67e74705SXin Li struct X : public virtual A, virtual V, public virtual B { XX70*67e74705SXin Li X(): A(), V(), B() {} // expected-warning {{base class 'A' will be initialized after base 'V'}} 71*67e74705SXin Li }; 72*67e74705SXin Li 73*67e74705SXin Li class Anon { 74*67e74705SXin Li int c; union {int a,b;}; int d; Anon()75*67e74705SXin Li Anon() : c(10), b(1), d(2) {} 76*67e74705SXin Li }; 77*67e74705SXin Li class Anon2 { 78*67e74705SXin Li int c; union {int a,b;}; int d; Anon2()79*67e74705SXin Li Anon2() : c(2), 80*67e74705SXin Li d(10), // expected-warning {{field 'd' will be initialized after field 'b'}} 81*67e74705SXin Li b(1) {} 82*67e74705SXin Li }; 83*67e74705SXin Li class Anon3 { 84*67e74705SXin Li union {int a,b;}; Anon3()85*67e74705SXin Li Anon3() : b(1) {} 86*67e74705SXin Li }; 87*67e74705SXin Li 88*67e74705SXin Li namespace T1 { 89*67e74705SXin Li 90*67e74705SXin Li struct S1 { }; 91*67e74705SXin Li struct S2: virtual S1 { }; 92*67e74705SXin Li struct S3 { }; 93*67e74705SXin Li 94*67e74705SXin Li struct S4: virtual S3, S2 { S4T1::S495*67e74705SXin Li S4() : S2(), // expected-warning {{base class 'T1::S2' will be initialized after base 'T1::S3'}} 96*67e74705SXin Li S3() { }; 97*67e74705SXin Li }; 98*67e74705SXin Li } 99*67e74705SXin Li 100*67e74705SXin Li namespace test2 { 101*67e74705SXin Li struct Foo { Foo(); }; 102*67e74705SXin Li class A { A(T * t)103*67e74705SXin Li template <class T> A(T *t) : 104*67e74705SXin Li y(), // expected-warning {{field 'y' will be initialized after field 'x'}} 105*67e74705SXin Li x() 106*67e74705SXin Li {} 107*67e74705SXin Li Foo x; 108*67e74705SXin Li Foo y; 109*67e74705SXin Li }; 110*67e74705SXin Li } 111*67e74705SXin Li 112*67e74705SXin Li // PR6575: this should not crash 113*67e74705SXin Li namespace test3 { 114*67e74705SXin Li struct MyClass { MyClasstest3::MyClass115*67e74705SXin Li MyClass() : m_int(0) {} 116*67e74705SXin Li union { 117*67e74705SXin Li struct { 118*67e74705SXin Li int m_int; 119*67e74705SXin Li }; 120*67e74705SXin Li }; 121*67e74705SXin Li }; 122*67e74705SXin Li } 123*67e74705SXin Li 124*67e74705SXin Li namespace PR7179 { 125*67e74705SXin Li struct X 126*67e74705SXin Li { 127*67e74705SXin Li struct Y 128*67e74705SXin Li { YPR7179::X::Y129*67e74705SXin Li template <class T> Y(T x) : X(x) { } 130*67e74705SXin Li }; 131*67e74705SXin Li }; 132*67e74705SXin Li } 133*67e74705SXin Li 134*67e74705SXin Li namespace test3 { 135*67e74705SXin Li struct foo { 136*67e74705SXin Li struct { 137*67e74705SXin Li int a; 138*67e74705SXin Li int b; 139*67e74705SXin Li }; footest3::foo140*67e74705SXin Li foo() : b(), a() { // expected-warning {{field 'b' will be initialized after field 'a'}} 141*67e74705SXin Li } 142*67e74705SXin Li }; 143*67e74705SXin Li } 144