1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
// 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;
};
};
};
}
|