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