1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -Wreorder -verify %s 2eb96e1275206b888eee484aac8b1b693417c6521Fariborz Jahanian 340c072f44ff081293f79909ecc518af23938108eFariborz Jahanianstruct BB {}; 4eb96e1275206b888eee484aac8b1b693417c6521Fariborz Jahanian 540c072f44ff081293f79909ecc518af23938108eFariborz Jahanianstruct BB1 {}; 6eb96e1275206b888eee484aac8b1b693417c6521Fariborz Jahanian 740c072f44ff081293f79909ecc518af23938108eFariborz Jahanianclass complex : public BB, BB1 { 8eb96e1275206b888eee484aac8b1b693417c6521Fariborz Jahanianpublic: 9d6ca8da0f5a4115813055729faaa5128e994806dJohn McCall complex() 10d6ca8da0f5a4115813055729faaa5128e994806dJohn McCall : s2(1), // expected-warning {{field 's2' will be initialized after field 's1'}} 11d6ca8da0f5a4115813055729faaa5128e994806dJohn McCall s1(1), 12d6ca8da0f5a4115813055729faaa5128e994806dJohn McCall s3(3), // expected-warning {{field 's3' will be initialized after base 'BB1'}} 13d6ca8da0f5a4115813055729faaa5128e994806dJohn McCall BB1(), // expected-warning {{base class 'BB1' will be initialized after base 'BB'}} 14d6ca8da0f5a4115813055729faaa5128e994806dJohn McCall BB() 15d6ca8da0f5a4115813055729faaa5128e994806dJohn McCall {} 16eb96e1275206b888eee484aac8b1b693417c6521Fariborz Jahanian int s1; 17eb96e1275206b888eee484aac8b1b693417c6521Fariborz Jahanian int s2; 18eb96e1275206b888eee484aac8b1b693417c6521Fariborz Jahanian int s3; 19eb96e1275206b888eee484aac8b1b693417c6521Fariborz Jahanian}; 2040c072f44ff081293f79909ecc518af23938108eFariborz Jahanian 2140c072f44ff081293f79909ecc518af23938108eFariborz Jahanian 2240c072f44ff081293f79909ecc518af23938108eFariborz Jahanian// testing virtual bases. 2340c072f44ff081293f79909ecc518af23938108eFariborz Jahanian 2440c072f44ff081293f79909ecc518af23938108eFariborz Jahanian 2540c072f44ff081293f79909ecc518af23938108eFariborz Jahanianstruct V { 2640c072f44ff081293f79909ecc518af23938108eFariborz Jahanian V(); 2740c072f44ff081293f79909ecc518af23938108eFariborz Jahanian}; 2840c072f44ff081293f79909ecc518af23938108eFariborz Jahanian 2940c072f44ff081293f79909ecc518af23938108eFariborz Jahanianstruct A : public virtual V { 3040c072f44ff081293f79909ecc518af23938108eFariborz Jahanian A(); 3140c072f44ff081293f79909ecc518af23938108eFariborz Jahanian}; 3240c072f44ff081293f79909ecc518af23938108eFariborz Jahanian 3340c072f44ff081293f79909ecc518af23938108eFariborz Jahanianstruct B : public virtual V { 3440c072f44ff081293f79909ecc518af23938108eFariborz Jahanian B(); 3540c072f44ff081293f79909ecc518af23938108eFariborz Jahanian}; 3640c072f44ff081293f79909ecc518af23938108eFariborz Jahanian 3740c072f44ff081293f79909ecc518af23938108eFariborz Jahanianstruct Diamond : public A, public B { 3840c072f44ff081293f79909ecc518af23938108eFariborz Jahanian Diamond() : A(), B() {} 3940c072f44ff081293f79909ecc518af23938108eFariborz Jahanian}; 4040c072f44ff081293f79909ecc518af23938108eFariborz Jahanian 4140c072f44ff081293f79909ecc518af23938108eFariborz Jahanian 4240c072f44ff081293f79909ecc518af23938108eFariborz Jahanianstruct C : public A, public B, private virtual V { 4340c072f44ff081293f79909ecc518af23938108eFariborz Jahanian C() { } 4440c072f44ff081293f79909ecc518af23938108eFariborz Jahanian}; 4540c072f44ff081293f79909ecc518af23938108eFariborz Jahanian 4640c072f44ff081293f79909ecc518af23938108eFariborz Jahanian 4740c072f44ff081293f79909ecc518af23938108eFariborz Jahanianstruct D : public A, public B { 48d6ca8da0f5a4115813055729faaa5128e994806dJohn McCall D() : A(), V() { } // expected-warning {{base class 'A' will be initialized after base 'V'}} 4940c072f44ff081293f79909ecc518af23938108eFariborz Jahanian}; 5040c072f44ff081293f79909ecc518af23938108eFariborz Jahanian 5140c072f44ff081293f79909ecc518af23938108eFariborz Jahanian 5240c072f44ff081293f79909ecc518af23938108eFariborz Jahanianstruct E : public A, public B, private virtual V { 53d6ca8da0f5a4115813055729faaa5128e994806dJohn McCall E() : A(), V() { } // expected-warning {{base class 'A' will be initialized after base 'V'}} 5440c072f44ff081293f79909ecc518af23938108eFariborz Jahanian}; 5540c072f44ff081293f79909ecc518af23938108eFariborz Jahanian 5640c072f44ff081293f79909ecc518af23938108eFariborz Jahanian 5740c072f44ff081293f79909ecc518af23938108eFariborz Jahanianstruct A1 { 5840c072f44ff081293f79909ecc518af23938108eFariborz Jahanian A1(); 5940c072f44ff081293f79909ecc518af23938108eFariborz Jahanian}; 6040c072f44ff081293f79909ecc518af23938108eFariborz Jahanian 6140c072f44ff081293f79909ecc518af23938108eFariborz Jahanianstruct B1 { 6240c072f44ff081293f79909ecc518af23938108eFariborz Jahanian B1(); 6340c072f44ff081293f79909ecc518af23938108eFariborz Jahanian}; 6440c072f44ff081293f79909ecc518af23938108eFariborz Jahanian 6540c072f44ff081293f79909ecc518af23938108eFariborz Jahanianstruct F : public A1, public B1, private virtual V { 66d6ca8da0f5a4115813055729faaa5128e994806dJohn McCall F() : A1(), V() { } // expected-warning {{base class 'A1' will be initialized after base 'V'}} 6740c072f44ff081293f79909ecc518af23938108eFariborz Jahanian}; 6840c072f44ff081293f79909ecc518af23938108eFariborz Jahanian 6940c072f44ff081293f79909ecc518af23938108eFariborz Jahanianstruct X : public virtual A, virtual V, public virtual B { 70d6ca8da0f5a4115813055729faaa5128e994806dJohn McCall X(): A(), V(), B() {} // expected-warning {{base class 'A' will be initialized after base 'V'}} 7140c072f44ff081293f79909ecc518af23938108eFariborz Jahanian}; 7240c072f44ff081293f79909ecc518af23938108eFariborz Jahanian 736347f420ee0b097c0e642dc6c51afee5f1b14235Eli Friedmanclass Anon { 746347f420ee0b097c0e642dc6c51afee5f1b14235Eli Friedman int c; union {int a,b;}; int d; 756347f420ee0b097c0e642dc6c51afee5f1b14235Eli Friedman Anon() : c(10), b(1), d(2) {} 766347f420ee0b097c0e642dc6c51afee5f1b14235Eli Friedman}; 776347f420ee0b097c0e642dc6c51afee5f1b14235Eli Friedmanclass Anon2 { 786347f420ee0b097c0e642dc6c51afee5f1b14235Eli Friedman int c; union {int a,b;}; int d; 796347f420ee0b097c0e642dc6c51afee5f1b14235Eli Friedman Anon2() : c(2), 80d6ca8da0f5a4115813055729faaa5128e994806dJohn McCall d(10), // expected-warning {{field 'd' will be initialized after field 'b'}} 81d6ca8da0f5a4115813055729faaa5128e994806dJohn McCall b(1) {} 826347f420ee0b097c0e642dc6c51afee5f1b14235Eli Friedman}; 836347f420ee0b097c0e642dc6c51afee5f1b14235Eli Friedmanclass Anon3 { 846347f420ee0b097c0e642dc6c51afee5f1b14235Eli Friedman union {int a,b;}; 856347f420ee0b097c0e642dc6c51afee5f1b14235Eli Friedman Anon3() : b(1) {} 866347f420ee0b097c0e642dc6c51afee5f1b14235Eli Friedman}; 876f6de731808ffd3664f0a179d1cb694c4e7e5342Anders Carlsson 886f6de731808ffd3664f0a179d1cb694c4e7e5342Anders Carlssonnamespace T1 { 896f6de731808ffd3664f0a179d1cb694c4e7e5342Anders Carlsson 906f6de731808ffd3664f0a179d1cb694c4e7e5342Anders Carlssonstruct S1 { }; 916f6de731808ffd3664f0a179d1cb694c4e7e5342Anders Carlssonstruct S2: virtual S1 { }; 926f6de731808ffd3664f0a179d1cb694c4e7e5342Anders Carlssonstruct S3 { }; 936f6de731808ffd3664f0a179d1cb694c4e7e5342Anders Carlsson 946f6de731808ffd3664f0a179d1cb694c4e7e5342Anders Carlssonstruct S4: virtual S3, S2 { 95d6ca8da0f5a4115813055729faaa5128e994806dJohn McCall S4() : S2(), // expected-warning {{base class 'T1::S2' will be initialized after base 'T1::S3'}} 96d6ca8da0f5a4115813055729faaa5128e994806dJohn McCall S3() { }; 976f6de731808ffd3664f0a179d1cb694c4e7e5342Anders Carlsson}; 986f6de731808ffd3664f0a179d1cb694c4e7e5342Anders Carlsson} 99d6ca8da0f5a4115813055729faaa5128e994806dJohn McCall 100d6ca8da0f5a4115813055729faaa5128e994806dJohn McCallnamespace test2 { 101d6ca8da0f5a4115813055729faaa5128e994806dJohn McCall struct Foo { Foo(); }; 102d6ca8da0f5a4115813055729faaa5128e994806dJohn McCall class A { 103d6ca8da0f5a4115813055729faaa5128e994806dJohn McCall template <class T> A(T *t) : 104d6ca8da0f5a4115813055729faaa5128e994806dJohn McCall y(), // expected-warning {{field 'y' will be initialized after field 'x'}} 105d6ca8da0f5a4115813055729faaa5128e994806dJohn McCall x() 106d6ca8da0f5a4115813055729faaa5128e994806dJohn McCall {} 107d6ca8da0f5a4115813055729faaa5128e994806dJohn McCall Foo x; 108d6ca8da0f5a4115813055729faaa5128e994806dJohn McCall Foo y; 109d6ca8da0f5a4115813055729faaa5128e994806dJohn McCall }; 110d6ca8da0f5a4115813055729faaa5128e994806dJohn McCall} 1113c3ccdbe73cb43bdf39a9102f5f7eb842fb71952John McCall 1123c3ccdbe73cb43bdf39a9102f5f7eb842fb71952John McCall// PR6575: this should not crash 1133c3ccdbe73cb43bdf39a9102f5f7eb842fb71952John McCallnamespace test3 { 1143c3ccdbe73cb43bdf39a9102f5f7eb842fb71952John McCall struct MyClass { 1153c3ccdbe73cb43bdf39a9102f5f7eb842fb71952John McCall MyClass() : m_int(0) {} 1163c3ccdbe73cb43bdf39a9102f5f7eb842fb71952John McCall union { 1173c3ccdbe73cb43bdf39a9102f5f7eb842fb71952John McCall struct { 1183c3ccdbe73cb43bdf39a9102f5f7eb842fb71952John McCall int m_int; 1193c3ccdbe73cb43bdf39a9102f5f7eb842fb71952John McCall }; 1203c3ccdbe73cb43bdf39a9102f5f7eb842fb71952John McCall }; 1213c3ccdbe73cb43bdf39a9102f5f7eb842fb71952John McCall }; 1223c3ccdbe73cb43bdf39a9102f5f7eb842fb71952John McCall} 123fe2d379dbf570d49dc5d98a086cf43c4e675f5ceDouglas Gregor 124fe2d379dbf570d49dc5d98a086cf43c4e675f5ceDouglas Gregornamespace PR7179 { 125fe2d379dbf570d49dc5d98a086cf43c4e675f5ceDouglas Gregor struct X 126fe2d379dbf570d49dc5d98a086cf43c4e675f5ceDouglas Gregor { 127fe2d379dbf570d49dc5d98a086cf43c4e675f5ceDouglas Gregor struct Y 128fe2d379dbf570d49dc5d98a086cf43c4e675f5ceDouglas Gregor { 129fe2d379dbf570d49dc5d98a086cf43c4e675f5ceDouglas Gregor template <class T> Y(T x) : X(x) { } 130fe2d379dbf570d49dc5d98a086cf43c4e675f5ceDouglas Gregor }; 131fe2d379dbf570d49dc5d98a086cf43c4e675f5ceDouglas Gregor }; 132fe2d379dbf570d49dc5d98a086cf43c4e675f5ceDouglas Gregor} 133ee000bb236fd99f297c253206e5f110a8f49661eDavid Blaikie 134ee000bb236fd99f297c253206e5f110a8f49661eDavid Blaikienamespace test3 { 135ee000bb236fd99f297c253206e5f110a8f49661eDavid Blaikie struct foo { 136ee000bb236fd99f297c253206e5f110a8f49661eDavid Blaikie struct { 137ee000bb236fd99f297c253206e5f110a8f49661eDavid Blaikie int a; 138ee000bb236fd99f297c253206e5f110a8f49661eDavid Blaikie int b; 139ee000bb236fd99f297c253206e5f110a8f49661eDavid Blaikie }; 140ee000bb236fd99f297c253206e5f110a8f49661eDavid Blaikie foo() : b(), a() { // expected-warning {{field 'b' will be initialized after field 'a'}} 141ee000bb236fd99f297c253206e5f110a8f49661eDavid Blaikie } 142ee000bb236fd99f297c253206e5f110a8f49661eDavid Blaikie }; 143ee000bb236fd99f297c253206e5f110a8f49661eDavid Blaikie} 144