forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			144 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			144 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C++
		
	
	
	
// RUN: %clang_cc1  -fsyntax-only -Wreorder -verify %s
 | 
						|
 | 
						|
struct BB {};
 | 
						|
 | 
						|
struct BB1 {};
 | 
						|
 | 
						|
class complex : public BB, BB1 { 
 | 
						|
public: 
 | 
						|
  complex()
 | 
						|
    : s2(1), // expected-warning {{field 's2' will be initialized after field 's1'}}
 | 
						|
      s1(1),
 | 
						|
      s3(3), // expected-warning {{field 's3' will be initialized after base 'BB1'}} 
 | 
						|
      BB1(), // expected-warning {{base class 'BB1' will be initialized after base 'BB'}}
 | 
						|
      BB()
 | 
						|
  {}
 | 
						|
  int s1;
 | 
						|
  int s2;
 | 
						|
  int s3;
 | 
						|
}; 
 | 
						|
 | 
						|
 | 
						|
// testing virtual bases.
 | 
						|
 | 
						|
 | 
						|
struct V { 
 | 
						|
  V();
 | 
						|
};
 | 
						|
 | 
						|
struct A : public virtual V { 
 | 
						|
  A(); 
 | 
						|
};
 | 
						|
 | 
						|
struct B : public virtual V {
 | 
						|
  B(); 
 | 
						|
};
 | 
						|
 | 
						|
struct Diamond : public A, public B {
 | 
						|
  Diamond() : A(), B() {}
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
struct C : public A, public B, private virtual V { 
 | 
						|
  C() { }
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
struct D : public A, public B { 
 | 
						|
  D()  : A(), V() {   } // expected-warning {{base class 'A' will be initialized after base 'V'}}
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
struct E : public A, public B, private virtual V { 
 | 
						|
  E()  : A(), V() {  } // expected-warning {{base class 'A' will be initialized after base 'V'}}
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
struct A1  { 
 | 
						|
  A1(); 
 | 
						|
};
 | 
						|
 | 
						|
struct B1 {
 | 
						|
  B1();
 | 
						|
};
 | 
						|
 | 
						|
struct F : public A1, public B1, private virtual V { 
 | 
						|
  F()  : A1(), V() {  } // expected-warning {{base class 'A1' will be initialized after base 'V'}}
 | 
						|
};
 | 
						|
 | 
						|
struct X : public virtual A, virtual V, public virtual B {
 | 
						|
  X(): A(), V(), B() {} // expected-warning {{base class 'A' will be initialized after base 'V'}}
 | 
						|
};
 | 
						|
 | 
						|
class Anon {
 | 
						|
  int c; union {int a,b;}; int d;
 | 
						|
  Anon() : c(10), b(1), d(2) {}
 | 
						|
};
 | 
						|
class Anon2 {
 | 
						|
  int c; union {int a,b;}; int d;
 | 
						|
  Anon2() : c(2),
 | 
						|
            d(10), // expected-warning {{field 'd' will be initialized after field 'b'}}
 | 
						|
            b(1) {}
 | 
						|
};
 | 
						|
class Anon3 {
 | 
						|
  union {int a,b;};
 | 
						|
  Anon3() : b(1) {}
 | 
						|
};
 | 
						|
 | 
						|
namespace T1 {
 | 
						|
 | 
						|
struct S1 { };
 | 
						|
struct S2: virtual S1 { };
 | 
						|
struct S3 { };
 | 
						|
 | 
						|
struct S4: virtual S3, S2 {
 | 
						|
  S4() : S2(), // expected-warning {{base class 'T1::S2' will be initialized after base 'T1::S3'}}
 | 
						|
    S3() { };
 | 
						|
};
 | 
						|
}
 | 
						|
 | 
						|
namespace test2 {
 | 
						|
  struct Foo { Foo(); };
 | 
						|
  class A {
 | 
						|
    template <class T> A(T *t) :
 | 
						|
      y(),  // expected-warning {{field 'y' will be initialized after field 'x'}}
 | 
						|
      x()
 | 
						|
    {}
 | 
						|
    Foo x;
 | 
						|
    Foo y;
 | 
						|
  };
 | 
						|
}
 | 
						|
 | 
						|
// PR6575: this should not crash
 | 
						|
namespace test3 {
 | 
						|
  struct MyClass {
 | 
						|
    MyClass() : m_int(0) {}
 | 
						|
    union {
 | 
						|
      struct {
 | 
						|
        int m_int;
 | 
						|
      };
 | 
						|
    };
 | 
						|
  };
 | 
						|
}
 | 
						|
 | 
						|
namespace PR7179 {
 | 
						|
  struct X
 | 
						|
  {
 | 
						|
    struct Y
 | 
						|
    {
 | 
						|
      template <class T> Y(T x) : X(x) { }
 | 
						|
    };
 | 
						|
  };
 | 
						|
}
 | 
						|
 | 
						|
namespace test3 {
 | 
						|
  struct foo {
 | 
						|
    struct {
 | 
						|
      int a;
 | 
						|
      int b;
 | 
						|
    };
 | 
						|
    foo() : b(), a() { // expected-warning {{field 'b' will be initialized after field 'a'}}
 | 
						|
    }
 | 
						|
  };
 | 
						|
}
 |