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