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