blob: 7d4e66c45ff31c3ee022bddcf40f1544dba695bb [file] [log] [blame]
Daniel Dunbara5728872009-12-15 20:14:24 +00001// RUN: %clang_cc1 -triple x86_64-unknown-unknown %s -fsyntax-only -verify
Anders Carlsson1345bd22009-09-24 03:22:10 +00002
3#define SA(n, p) int a##n[(p) ? 1 : -1]
4
Anders Carlssonbfcdc402010-05-23 18:14:24 +00005namespace Test0 {
6
Anders Carlsson1345bd22009-09-24 03:22:10 +00007struct A { int a; };
8SA(0, sizeof(A) == 4);
9
10struct B { };
11SA(1, sizeof(B) == 1);
12
13struct C : A, B { };
14SA(2, sizeof(C) == 4);
Anders Carlssonffbdefc2009-09-24 05:21:31 +000015
16struct D { };
17struct E : D { };
18struct F : E { };
19
20struct G : E, F { };
21SA(3, sizeof(G) == 2);
Anders Carlsson60265042009-09-25 00:02:51 +000022
Anders Carlssonfbbce492009-09-25 01:23:32 +000023struct Empty { Empty(); };
Anders Carlsson60265042009-09-25 00:02:51 +000024
Anders Carlssonfbbce492009-09-25 01:23:32 +000025struct I : Empty {
26 Empty e;
Anders Carlsson60265042009-09-25 00:02:51 +000027};
28SA(4, sizeof(I) == 2);
Anders Carlssonfbbce492009-09-25 01:23:32 +000029
30struct J : Empty {
31 Empty e[2];
32};
Anders Carlssona4c60812009-09-25 01:54:38 +000033SA(5, sizeof(J) == 3);
34
35template<int N> struct Derived : Empty, Derived<N - 1> {
36};
37template<> struct Derived<0> : Empty { };
38
39struct S1 : virtual Derived<10> {
40 Empty e;
41};
42SA(6, sizeof(S1) == 24);
43
44struct S2 : virtual Derived<10> {
45 Empty e[2];
46};
47SA(7, sizeof(S2) == 24);
Anders Carlsson1eca99b2009-09-25 15:39:00 +000048
49struct S3 {
50 Empty e;
51};
52
53struct S4 : Empty, S3 {
54};
55SA(8, sizeof(S4) == 2);
56
57struct S5 : S3, Empty {};
58SA(9, sizeof(S5) == 2);
59
60struct S6 : S5 { };
61SA(10, sizeof(S6) == 2);
Anders Carlsson7e410382009-09-26 01:09:35 +000062
63struct S7 : Empty {
64 void *v;
65};
66SA(11, sizeof(S7) == 8);
Anders Carlssondfde6812009-09-26 01:29:10 +000067
68struct S8 : Empty, A {
69};
70SA(12, sizeof(S8) == 4);
Anders Carlssonbfcdc402010-05-23 18:14:24 +000071
72}
73
74namespace Test1 {
75
76// Test that we don't try to place both A subobjects at offset 0.
77struct A { };
78class B { virtual void f(); };
79class C : A, virtual B { };
80struct D : virtual C { };
81struct E : virtual A { };
82class F : D, E { };
83
84SA(0, sizeof(F) == 24);
85
86}
Anders Carlsson1a8d1512010-05-27 16:07:49 +000087
88namespace Test2 {
89
90// Test that B::a isn't laid out at offset 0.
91struct Empty { };
92struct A : Empty { };
93struct B : Empty {
94 A a;
95};
96
97SA(0, sizeof(B) == 2);
98
99}
100
101namespace Test3 {
102
103// Test that B::a isn't laid out at offset 0.
104struct Empty { };
105struct A { Empty e; };
106struct B : Empty {
107 A a;
108};
109
110SA(0, sizeof(B) == 2);
111
112}