1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -triple x86_64-unknown-unknown %s -fsyntax-only -verify
28e8fb3be5bd78f0564444eca02b404566a5f3b5dAndy Gibbs// expected-no-diagnostics
31345bd2b093e78620c32f5148b1279ed290188e8Anders Carlsson
41345bd2b093e78620c32f5148b1279ed290188e8Anders Carlsson#define SA(n, p) int a##n[(p) ? 1 : -1]
51345bd2b093e78620c32f5148b1279ed290188e8Anders Carlsson
6bfcdc40cbc213d91d91513ba8e1fbde65734ddf4Anders Carlssonnamespace Test0 {
7bfcdc40cbc213d91d91513ba8e1fbde65734ddf4Anders Carlsson
81345bd2b093e78620c32f5148b1279ed290188e8Anders Carlssonstruct A { int a; };
91345bd2b093e78620c32f5148b1279ed290188e8Anders CarlssonSA(0, sizeof(A) == 4);
101345bd2b093e78620c32f5148b1279ed290188e8Anders Carlsson
111345bd2b093e78620c32f5148b1279ed290188e8Anders Carlssonstruct B { };
121345bd2b093e78620c32f5148b1279ed290188e8Anders CarlssonSA(1, sizeof(B) == 1);
131345bd2b093e78620c32f5148b1279ed290188e8Anders Carlsson
141345bd2b093e78620c32f5148b1279ed290188e8Anders Carlssonstruct C : A, B { };
151345bd2b093e78620c32f5148b1279ed290188e8Anders CarlssonSA(2, sizeof(C) == 4);
16ffbdefc7a24c01a0f77425423278774796a3aa53Anders Carlsson
17ffbdefc7a24c01a0f77425423278774796a3aa53Anders Carlssonstruct D { };
18ffbdefc7a24c01a0f77425423278774796a3aa53Anders Carlssonstruct E : D { };
19ffbdefc7a24c01a0f77425423278774796a3aa53Anders Carlssonstruct F : E { };
20ffbdefc7a24c01a0f77425423278774796a3aa53Anders Carlsson
21ffbdefc7a24c01a0f77425423278774796a3aa53Anders Carlssonstruct G : E, F { };
22ffbdefc7a24c01a0f77425423278774796a3aa53Anders CarlssonSA(3, sizeof(G) == 2);
236026504302763f74102592602b392cecd5ced3aeAnders Carlsson
24fbbce49c116aa8c8c7c0707cb6048b55f70461a9Anders Carlssonstruct Empty { Empty(); };
256026504302763f74102592602b392cecd5ced3aeAnders Carlsson
26fbbce49c116aa8c8c7c0707cb6048b55f70461a9Anders Carlssonstruct I : Empty {
27fbbce49c116aa8c8c7c0707cb6048b55f70461a9Anders Carlsson  Empty e;
286026504302763f74102592602b392cecd5ced3aeAnders Carlsson};
296026504302763f74102592602b392cecd5ced3aeAnders CarlssonSA(4, sizeof(I) == 2);
30fbbce49c116aa8c8c7c0707cb6048b55f70461a9Anders Carlsson
31fbbce49c116aa8c8c7c0707cb6048b55f70461a9Anders Carlssonstruct J : Empty {
32fbbce49c116aa8c8c7c0707cb6048b55f70461a9Anders Carlsson  Empty e[2];
33fbbce49c116aa8c8c7c0707cb6048b55f70461a9Anders Carlsson};
34a4c6081abd5582515b110bdcb576b4b85536467bAnders CarlssonSA(5, sizeof(J) == 3);
35a4c6081abd5582515b110bdcb576b4b85536467bAnders Carlsson
36a4c6081abd5582515b110bdcb576b4b85536467bAnders Carlssontemplate<int N> struct Derived : Empty, Derived<N - 1> {
37a4c6081abd5582515b110bdcb576b4b85536467bAnders Carlsson};
38a4c6081abd5582515b110bdcb576b4b85536467bAnders Carlssontemplate<> struct Derived<0> : Empty { };
39a4c6081abd5582515b110bdcb576b4b85536467bAnders Carlsson
40a4c6081abd5582515b110bdcb576b4b85536467bAnders Carlssonstruct S1 : virtual Derived<10> {
41a4c6081abd5582515b110bdcb576b4b85536467bAnders Carlsson  Empty e;
42a4c6081abd5582515b110bdcb576b4b85536467bAnders Carlsson};
43a4c6081abd5582515b110bdcb576b4b85536467bAnders CarlssonSA(6, sizeof(S1) == 24);
44a4c6081abd5582515b110bdcb576b4b85536467bAnders Carlsson
45a4c6081abd5582515b110bdcb576b4b85536467bAnders Carlssonstruct S2 : virtual Derived<10> {
46a4c6081abd5582515b110bdcb576b4b85536467bAnders Carlsson  Empty e[2];
47a4c6081abd5582515b110bdcb576b4b85536467bAnders Carlsson};
48a4c6081abd5582515b110bdcb576b4b85536467bAnders CarlssonSA(7, sizeof(S2) == 24);
491eca99b815e531eba63233c0558af0dc971387aaAnders Carlsson
501eca99b815e531eba63233c0558af0dc971387aaAnders Carlssonstruct S3 {
511eca99b815e531eba63233c0558af0dc971387aaAnders Carlsson  Empty e;
521eca99b815e531eba63233c0558af0dc971387aaAnders Carlsson};
531eca99b815e531eba63233c0558af0dc971387aaAnders Carlsson
541eca99b815e531eba63233c0558af0dc971387aaAnders Carlssonstruct S4 : Empty, S3 {
551eca99b815e531eba63233c0558af0dc971387aaAnders Carlsson};
561eca99b815e531eba63233c0558af0dc971387aaAnders CarlssonSA(8, sizeof(S4) == 2);
571eca99b815e531eba63233c0558af0dc971387aaAnders Carlsson
581eca99b815e531eba63233c0558af0dc971387aaAnders Carlssonstruct S5 : S3, Empty {};
591eca99b815e531eba63233c0558af0dc971387aaAnders CarlssonSA(9, sizeof(S5) == 2);
601eca99b815e531eba63233c0558af0dc971387aaAnders Carlsson
611eca99b815e531eba63233c0558af0dc971387aaAnders Carlssonstruct S6 : S5 { };
621eca99b815e531eba63233c0558af0dc971387aaAnders CarlssonSA(10, sizeof(S6) == 2);
637e41038723bf77132674f55b12f60e24e5473b33Anders Carlsson
647e41038723bf77132674f55b12f60e24e5473b33Anders Carlssonstruct S7 : Empty {
657e41038723bf77132674f55b12f60e24e5473b33Anders Carlsson  void *v;
667e41038723bf77132674f55b12f60e24e5473b33Anders Carlsson};
677e41038723bf77132674f55b12f60e24e5473b33Anders CarlssonSA(11, sizeof(S7) == 8);
68dfde681bddd525fd8dcebc98865ff74682d8b833Anders Carlsson
69dfde681bddd525fd8dcebc98865ff74682d8b833Anders Carlssonstruct S8 : Empty, A {
70dfde681bddd525fd8dcebc98865ff74682d8b833Anders Carlsson};
71dfde681bddd525fd8dcebc98865ff74682d8b833Anders CarlssonSA(12, sizeof(S8) == 4);
72bfcdc40cbc213d91d91513ba8e1fbde65734ddf4Anders Carlsson
73bfcdc40cbc213d91d91513ba8e1fbde65734ddf4Anders Carlsson}
74bfcdc40cbc213d91d91513ba8e1fbde65734ddf4Anders Carlsson
75bfcdc40cbc213d91d91513ba8e1fbde65734ddf4Anders Carlssonnamespace Test1 {
76bfcdc40cbc213d91d91513ba8e1fbde65734ddf4Anders Carlsson
77bfcdc40cbc213d91d91513ba8e1fbde65734ddf4Anders Carlsson// Test that we don't try to place both A subobjects at offset 0.
78bfcdc40cbc213d91d91513ba8e1fbde65734ddf4Anders Carlssonstruct A { };
79bfcdc40cbc213d91d91513ba8e1fbde65734ddf4Anders Carlssonclass B { virtual void f(); };
80bfcdc40cbc213d91d91513ba8e1fbde65734ddf4Anders Carlssonclass C : A, virtual B { };
81bfcdc40cbc213d91d91513ba8e1fbde65734ddf4Anders Carlssonstruct D : virtual C { };
82bfcdc40cbc213d91d91513ba8e1fbde65734ddf4Anders Carlssonstruct E : virtual A { };
83bfcdc40cbc213d91d91513ba8e1fbde65734ddf4Anders Carlssonclass F : D, E { };
84bfcdc40cbc213d91d91513ba8e1fbde65734ddf4Anders Carlsson
85bfcdc40cbc213d91d91513ba8e1fbde65734ddf4Anders CarlssonSA(0, sizeof(F) == 24);
86bfcdc40cbc213d91d91513ba8e1fbde65734ddf4Anders Carlsson
87bfcdc40cbc213d91d91513ba8e1fbde65734ddf4Anders Carlsson}
881a8d1511cde781787550576306085bd9300feb5aAnders Carlsson
891a8d1511cde781787550576306085bd9300feb5aAnders Carlssonnamespace Test2 {
901a8d1511cde781787550576306085bd9300feb5aAnders Carlsson
911a8d1511cde781787550576306085bd9300feb5aAnders Carlsson// Test that B::a isn't laid out at offset 0.
921a8d1511cde781787550576306085bd9300feb5aAnders Carlssonstruct Empty { };
931a8d1511cde781787550576306085bd9300feb5aAnders Carlssonstruct A : Empty { };
941a8d1511cde781787550576306085bd9300feb5aAnders Carlssonstruct B : Empty {
951a8d1511cde781787550576306085bd9300feb5aAnders Carlsson  A a;
961a8d1511cde781787550576306085bd9300feb5aAnders Carlsson};
971a8d1511cde781787550576306085bd9300feb5aAnders Carlsson
981a8d1511cde781787550576306085bd9300feb5aAnders CarlssonSA(0, sizeof(B) == 2);
991a8d1511cde781787550576306085bd9300feb5aAnders Carlsson
1001a8d1511cde781787550576306085bd9300feb5aAnders Carlsson}
1011a8d1511cde781787550576306085bd9300feb5aAnders Carlsson
1021a8d1511cde781787550576306085bd9300feb5aAnders Carlssonnamespace Test3 {
1031a8d1511cde781787550576306085bd9300feb5aAnders Carlsson
1041a8d1511cde781787550576306085bd9300feb5aAnders Carlsson// Test that B::a isn't laid out at offset 0.
1051a8d1511cde781787550576306085bd9300feb5aAnders Carlssonstruct Empty { };
1061a8d1511cde781787550576306085bd9300feb5aAnders Carlssonstruct A { Empty e; };
107bff9eb73031494a7a728ced66d1de150f28fd99fAnders Carlssonstruct B : Empty { A a; };
1081a8d1511cde781787550576306085bd9300feb5aAnders CarlssonSA(0, sizeof(B) == 2);
1091a8d1511cde781787550576306085bd9300feb5aAnders Carlsson
1101a8d1511cde781787550576306085bd9300feb5aAnders Carlsson}
111bff9eb73031494a7a728ced66d1de150f28fd99fAnders Carlsson
112bff9eb73031494a7a728ced66d1de150f28fd99fAnders Carlssonnamespace Test4 {
113bff9eb73031494a7a728ced66d1de150f28fd99fAnders Carlsson
114bff9eb73031494a7a728ced66d1de150f28fd99fAnders Carlsson// Test that C::Empty isn't laid out at offset 0.
115bff9eb73031494a7a728ced66d1de150f28fd99fAnders Carlssonstruct Empty { };
116bff9eb73031494a7a728ced66d1de150f28fd99fAnders Carlssonstruct A : Empty { };
117bff9eb73031494a7a728ced66d1de150f28fd99fAnders Carlssonstruct B { A a; };
118bff9eb73031494a7a728ced66d1de150f28fd99fAnders Carlssonstruct C : B, Empty { };
119bff9eb73031494a7a728ced66d1de150f28fd99fAnders CarlssonSA(0, sizeof(C) == 2);
120bff9eb73031494a7a728ced66d1de150f28fd99fAnders Carlsson
12145f5b54d67215639ae6585d12df5133e99180c2bAnders Carlsson}
12245f5b54d67215639ae6585d12df5133e99180c2bAnders Carlsson
12345f5b54d67215639ae6585d12df5133e99180c2bAnders Carlssonnamespace Test5 {
12445f5b54d67215639ae6585d12df5133e99180c2bAnders Carlsson
12545f5b54d67215639ae6585d12df5133e99180c2bAnders Carlsson// Test that B::Empty isn't laid out at offset 0.
12645f5b54d67215639ae6585d12df5133e99180c2bAnders Carlssonstruct Empty { };
12745f5b54d67215639ae6585d12df5133e99180c2bAnders Carlssonstruct Field : virtual Empty { };
12845f5b54d67215639ae6585d12df5133e99180c2bAnders Carlssonstruct A {
12945f5b54d67215639ae6585d12df5133e99180c2bAnders Carlsson  Field f;
13045f5b54d67215639ae6585d12df5133e99180c2bAnders Carlsson};
13145f5b54d67215639ae6585d12df5133e99180c2bAnders Carlssonstruct B : A, Empty { };
13245f5b54d67215639ae6585d12df5133e99180c2bAnders CarlssonSA(0, sizeof(B) == 16);
13345f5b54d67215639ae6585d12df5133e99180c2bAnders Carlsson
13445f5b54d67215639ae6585d12df5133e99180c2bAnders Carlsson}
13545f5b54d67215639ae6585d12df5133e99180c2bAnders Carlsson
13645f5b54d67215639ae6585d12df5133e99180c2bAnders Carlssonnamespace Test6 {
13745f5b54d67215639ae6585d12df5133e99180c2bAnders Carlsson
13845f5b54d67215639ae6585d12df5133e99180c2bAnders Carlsson// Test that B::A isn't laid out at offset 0.
13945f5b54d67215639ae6585d12df5133e99180c2bAnders Carlssonstruct Empty { };
14045f5b54d67215639ae6585d12df5133e99180c2bAnders Carlssonstruct Field : virtual Empty { };
14145f5b54d67215639ae6585d12df5133e99180c2bAnders Carlssonstruct A {
14245f5b54d67215639ae6585d12df5133e99180c2bAnders Carlsson  Field f;
14345f5b54d67215639ae6585d12df5133e99180c2bAnders Carlsson};
14445f5b54d67215639ae6585d12df5133e99180c2bAnders Carlssonstruct B : Empty, A { };
14545f5b54d67215639ae6585d12df5133e99180c2bAnders CarlssonSA(0, sizeof(B) == 16);
14645f5b54d67215639ae6585d12df5133e99180c2bAnders Carlsson
14745f5b54d67215639ae6585d12df5133e99180c2bAnders Carlsson}
14883be12c8638a5136b937e602b3a9e25f4bc8e50dEli Friedman
14983be12c8638a5136b937e602b3a9e25f4bc8e50dEli Friedmannamespace Test7 {
15083be12c8638a5136b937e602b3a9e25f4bc8e50dEli Friedman  // Make sure we reserve enough space for both bases; PR11745.
15183be12c8638a5136b937e602b3a9e25f4bc8e50dEli Friedman  struct Empty { };
15283be12c8638a5136b937e602b3a9e25f4bc8e50dEli Friedman  struct Base1 : Empty { };
15383be12c8638a5136b937e602b3a9e25f4bc8e50dEli Friedman  struct Base2 : Empty { };
15483be12c8638a5136b937e602b3a9e25f4bc8e50dEli Friedman  struct Test : Base1, Base2 {
15583be12c8638a5136b937e602b3a9e25f4bc8e50dEli Friedman    char c;
15683be12c8638a5136b937e602b3a9e25f4bc8e50dEli Friedman  };
15783be12c8638a5136b937e602b3a9e25f4bc8e50dEli Friedman  SA(0, sizeof(Test) == 2);
15883be12c8638a5136b937e602b3a9e25f4bc8e50dEli Friedman}
159d5e839429771ad4d1a8b3db598cbbc6d93621f75Richard Smith
160d5e839429771ad4d1a8b3db598cbbc6d93621f75Richard Smithnamespace Test8 {
161d5e839429771ad4d1a8b3db598cbbc6d93621f75Richard Smith  // Test that type sugar doesn't make us incorrectly determine the size of an
162d5e839429771ad4d1a8b3db598cbbc6d93621f75Richard Smith  // array of empty classes.
163d5e839429771ad4d1a8b3db598cbbc6d93621f75Richard Smith  struct Empty1 {};
164d5e839429771ad4d1a8b3db598cbbc6d93621f75Richard Smith  struct Empty2 {};
165d5e839429771ad4d1a8b3db598cbbc6d93621f75Richard Smith  struct Empties : Empty1, Empty2 {};
166d5e839429771ad4d1a8b3db598cbbc6d93621f75Richard Smith  typedef Empty1 Sugar[4];
167d5e839429771ad4d1a8b3db598cbbc6d93621f75Richard Smith  struct A : Empty2, Empties {
168d5e839429771ad4d1a8b3db598cbbc6d93621f75Richard Smith    // This must go at offset 2, because if it were at offset 0,
169d5e839429771ad4d1a8b3db598cbbc6d93621f75Richard Smith    // V[0][1] would overlap Empties::Empty1.
170d5e839429771ad4d1a8b3db598cbbc6d93621f75Richard Smith    Sugar V[1];
171d5e839429771ad4d1a8b3db598cbbc6d93621f75Richard Smith  };
172d5e839429771ad4d1a8b3db598cbbc6d93621f75Richard Smith  SA(0, sizeof(A) == 6);
173d5e839429771ad4d1a8b3db598cbbc6d93621f75Richard Smith}
174