1*f4a2713aSLionel Sambuc // RUN: %clang_cc1 -triple x86_64-unknown-unknown %s -fsyntax-only -verify -std=c++98 2*f4a2713aSLionel Sambuc // RUN: %clang_cc1 -triple x86_64-unknown-unknown %s -fsyntax-only -verify -std=c++11 3*f4a2713aSLionel Sambuc // expected-no-diagnostics 4*f4a2713aSLionel Sambuc 5*f4a2713aSLionel Sambuc #define SA(n, p) int a##n[(p) ? 1 : -1] 6*f4a2713aSLionel Sambuc 7*f4a2713aSLionel Sambuc struct A { 8*f4a2713aSLionel Sambuc int a; 9*f4a2713aSLionel Sambuc char b; 10*f4a2713aSLionel Sambuc }; 11*f4a2713aSLionel Sambuc 12*f4a2713aSLionel Sambuc SA(0, sizeof(A) == 8); 13*f4a2713aSLionel Sambuc 14*f4a2713aSLionel Sambuc struct B : A { 15*f4a2713aSLionel Sambuc char c; 16*f4a2713aSLionel Sambuc }; 17*f4a2713aSLionel Sambuc 18*f4a2713aSLionel Sambuc SA(1, sizeof(B) == 12); 19*f4a2713aSLionel Sambuc 20*f4a2713aSLionel Sambuc struct C { 21*f4a2713aSLionel Sambuc // Make fields private so C won't be a POD type. 22*f4a2713aSLionel Sambuc private: 23*f4a2713aSLionel Sambuc int a; 24*f4a2713aSLionel Sambuc char b; 25*f4a2713aSLionel Sambuc }; 26*f4a2713aSLionel Sambuc 27*f4a2713aSLionel Sambuc SA(2, sizeof(C) == 8); 28*f4a2713aSLionel Sambuc 29*f4a2713aSLionel Sambuc struct D : C { 30*f4a2713aSLionel Sambuc char c; 31*f4a2713aSLionel Sambuc }; 32*f4a2713aSLionel Sambuc 33*f4a2713aSLionel Sambuc SA(3, sizeof(D) == 8); 34*f4a2713aSLionel Sambuc 35*f4a2713aSLionel Sambuc struct __attribute__((packed)) E { 36*f4a2713aSLionel Sambuc char b; 37*f4a2713aSLionel Sambuc int a; 38*f4a2713aSLionel Sambuc }; 39*f4a2713aSLionel Sambuc 40*f4a2713aSLionel Sambuc SA(4, sizeof(E) == 5); 41*f4a2713aSLionel Sambuc 42*f4a2713aSLionel Sambuc struct __attribute__((packed)) F : E { 43*f4a2713aSLionel Sambuc char d; 44*f4a2713aSLionel Sambuc }; 45*f4a2713aSLionel Sambuc 46*f4a2713aSLionel Sambuc SA(5, sizeof(F) == 6); 47*f4a2713aSLionel Sambuc 48*f4a2713aSLionel Sambuc struct G { G(); }; 49*f4a2713aSLionel Sambuc struct H : G { }; 50*f4a2713aSLionel Sambuc 51*f4a2713aSLionel Sambuc SA(6, sizeof(H) == 1); 52*f4a2713aSLionel Sambuc 53*f4a2713aSLionel Sambuc struct I { 54*f4a2713aSLionel Sambuc char b; 55*f4a2713aSLionel Sambuc int a; 56*f4a2713aSLionel Sambuc } __attribute__((packed)); 57*f4a2713aSLionel Sambuc 58*f4a2713aSLionel Sambuc SA(6_1, sizeof(I) == 5); 59*f4a2713aSLionel Sambuc 60*f4a2713aSLionel Sambuc // PR5580 61*f4a2713aSLionel Sambuc namespace PR5580 { 62*f4a2713aSLionel Sambuc 63*f4a2713aSLionel Sambuc class A { bool iv0 : 1; }; 64*f4a2713aSLionel Sambuc SA(7, sizeof(A) == 1); 65*f4a2713aSLionel Sambuc 66*f4a2713aSLionel Sambuc class B : A { bool iv0 : 1; }; 67*f4a2713aSLionel Sambuc SA(8, sizeof(B) == 2); 68*f4a2713aSLionel Sambuc 69*f4a2713aSLionel Sambuc struct C { bool iv0 : 1; }; 70*f4a2713aSLionel Sambuc SA(9, sizeof(C) == 1); 71*f4a2713aSLionel Sambuc 72*f4a2713aSLionel Sambuc struct D : C { bool iv0 : 1; }; 73*f4a2713aSLionel Sambuc SA(10, sizeof(D) == 2); 74*f4a2713aSLionel Sambuc 75*f4a2713aSLionel Sambuc } 76*f4a2713aSLionel Sambuc 77*f4a2713aSLionel Sambuc namespace Test1 { 78*f4a2713aSLionel Sambuc 79*f4a2713aSLionel Sambuc // Test that we don't assert on this hierarchy. 80*f4a2713aSLionel Sambuc struct A { }; 81*f4a2713aSLionel Sambuc struct B : A { virtual void b(); }; 82*f4a2713aSLionel Sambuc class C : virtual A { int c; }; 83*f4a2713aSLionel Sambuc struct D : virtual B { }; 84*f4a2713aSLionel Sambuc struct E : C, virtual D { }; 85*f4a2713aSLionel Sambuc class F : virtual E { }; 86*f4a2713aSLionel Sambuc struct G : virtual E, F { }; 87*f4a2713aSLionel Sambuc 88*f4a2713aSLionel Sambuc SA(0, sizeof(G) == 24); 89*f4a2713aSLionel Sambuc 90*f4a2713aSLionel Sambuc } 91*f4a2713aSLionel Sambuc 92*f4a2713aSLionel Sambuc namespace Test2 { 93*f4a2713aSLionel Sambuc 94*f4a2713aSLionel Sambuc // Test that this somewhat complex class structure is laid out correctly. 95*f4a2713aSLionel Sambuc struct A { }; 96*f4a2713aSLionel Sambuc struct B : A { virtual void b(); }; 97*f4a2713aSLionel Sambuc struct C : virtual B { }; 98*f4a2713aSLionel Sambuc struct D : virtual A { }; 99*f4a2713aSLionel Sambuc struct E : virtual B, D { }; 100*f4a2713aSLionel Sambuc struct F : E, virtual C { }; 101*f4a2713aSLionel Sambuc struct G : virtual F, A { }; 102*f4a2713aSLionel Sambuc struct H { G g; }; 103*f4a2713aSLionel Sambuc 104*f4a2713aSLionel Sambuc SA(0, sizeof(H) == 24); 105*f4a2713aSLionel Sambuc 106*f4a2713aSLionel Sambuc } 107*f4a2713aSLionel Sambuc 108*f4a2713aSLionel Sambuc namespace PR16537 { 109*f4a2713aSLionel Sambuc namespace test1 { 110*f4a2713aSLionel Sambuc struct pod_in_11_only { 111*f4a2713aSLionel Sambuc private: 112*f4a2713aSLionel Sambuc long long x; 113*f4a2713aSLionel Sambuc }; 114*f4a2713aSLionel Sambuc 115*f4a2713aSLionel Sambuc struct tail_padded_pod_in_11_only { 116*f4a2713aSLionel Sambuc pod_in_11_only pod11; 117*f4a2713aSLionel Sambuc char tail_padding; 118*f4a2713aSLionel Sambuc }; 119*f4a2713aSLionel Sambuc 120*f4a2713aSLionel Sambuc struct might_use_tail_padding : public tail_padded_pod_in_11_only { 121*f4a2713aSLionel Sambuc char may_go_into_tail_padding; 122*f4a2713aSLionel Sambuc }; 123*f4a2713aSLionel Sambuc 124*f4a2713aSLionel Sambuc SA(0, sizeof(might_use_tail_padding) == 16); 125*f4a2713aSLionel Sambuc } 126*f4a2713aSLionel Sambuc 127*f4a2713aSLionel Sambuc namespace test2 { 128*f4a2713aSLionel Sambuc struct pod_in_11_only { 129*f4a2713aSLionel Sambuc private: 130*f4a2713aSLionel Sambuc long long x; 131*f4a2713aSLionel Sambuc }; 132*f4a2713aSLionel Sambuc 133*f4a2713aSLionel Sambuc struct tail_padded_pod_in_11_only { 134*f4a2713aSLionel Sambuc pod_in_11_only pod11 __attribute__((aligned(16))); 135*f4a2713aSLionel Sambuc }; 136*f4a2713aSLionel Sambuc 137*f4a2713aSLionel Sambuc struct might_use_tail_padding : public tail_padded_pod_in_11_only { 138*f4a2713aSLionel Sambuc char may_go_into_tail_padding; 139*f4a2713aSLionel Sambuc }; 140*f4a2713aSLionel Sambuc 141*f4a2713aSLionel Sambuc SA(0, sizeof(might_use_tail_padding) == 16); 142*f4a2713aSLionel Sambuc } 143*f4a2713aSLionel Sambuc 144*f4a2713aSLionel Sambuc namespace test3 { 145*f4a2713aSLionel Sambuc struct pod_in_11_only { 146*f4a2713aSLionel Sambuc private: 147*f4a2713aSLionel Sambuc long long x; 148*f4a2713aSLionel Sambuc }; 149*f4a2713aSLionel Sambuc 150*f4a2713aSLionel Sambuc struct tail_padded_pod_in_11_only { 151*f4a2713aSLionel Sambuc pod_in_11_only pod11; 152*f4a2713aSLionel Sambuc char tail_padding; 153*f4a2713aSLionel Sambuc }; 154*f4a2713aSLionel Sambuc 155*f4a2713aSLionel Sambuc struct second_base { 156*f4a2713aSLionel Sambuc char foo; 157*f4a2713aSLionel Sambuc }; 158*f4a2713aSLionel Sambuc 159*f4a2713aSLionel Sambuc struct might_use_tail_padding : public tail_padded_pod_in_11_only, public second_base { 160*f4a2713aSLionel Sambuc 161*f4a2713aSLionel Sambuc }; 162*f4a2713aSLionel Sambuc SA(0, sizeof(might_use_tail_padding) == 16); 163*f4a2713aSLionel Sambuc } 164*f4a2713aSLionel Sambuc 165*f4a2713aSLionel Sambuc namespace test4 { 166*f4a2713aSLionel Sambuc struct pod_in_11_only { 167*f4a2713aSLionel Sambuc private: 168*f4a2713aSLionel Sambuc long long x; 169*f4a2713aSLionel Sambuc }; 170*f4a2713aSLionel Sambuc 171*f4a2713aSLionel Sambuc struct tail_padded_pod_in_11_only { 172*f4a2713aSLionel Sambuc pod_in_11_only pod11; 173*f4a2713aSLionel Sambuc char tail_padding; 174*f4a2713aSLionel Sambuc }; 175*f4a2713aSLionel Sambuc 176*f4a2713aSLionel Sambuc struct second_base { 177*f4a2713aSLionel Sambuc char foo; 178*f4a2713aSLionel Sambuc }; 179*f4a2713aSLionel Sambuc 180*f4a2713aSLionel Sambuc struct might_use_tail_padding : public tail_padded_pod_in_11_only, public second_base { 181*f4a2713aSLionel Sambuc char may_go_into_tail_padding; 182*f4a2713aSLionel Sambuc }; 183*f4a2713aSLionel Sambuc SA(0, sizeof(might_use_tail_padding) == 16); 184*f4a2713aSLionel Sambuc } 185*f4a2713aSLionel Sambuc 186*f4a2713aSLionel Sambuc namespace test5 { 187*f4a2713aSLionel Sambuc struct pod_in_11_only { 188*f4a2713aSLionel Sambuc private: 189*f4a2713aSLionel Sambuc long long x; 190*f4a2713aSLionel Sambuc }; 191*f4a2713aSLionel Sambuc 192*f4a2713aSLionel Sambuc struct pod_in_11_only2 { 193*f4a2713aSLionel Sambuc private: 194*f4a2713aSLionel Sambuc long long x; 195*f4a2713aSLionel Sambuc }; 196*f4a2713aSLionel Sambuc 197*f4a2713aSLionel Sambuc struct tail_padded_pod_in_11_only { 198*f4a2713aSLionel Sambuc pod_in_11_only pod11; 199*f4a2713aSLionel Sambuc char tail_padding; 200*f4a2713aSLionel Sambuc }; 201*f4a2713aSLionel Sambuc 202*f4a2713aSLionel Sambuc struct second_base { 203*f4a2713aSLionel Sambuc pod_in_11_only2 two; 204*f4a2713aSLionel Sambuc char foo; 205*f4a2713aSLionel Sambuc }; 206*f4a2713aSLionel Sambuc 207*f4a2713aSLionel Sambuc struct might_use_tail_padding : public tail_padded_pod_in_11_only, public second_base { 208*f4a2713aSLionel Sambuc char may_go_into_tail_padding; 209*f4a2713aSLionel Sambuc }; 210*f4a2713aSLionel Sambuc SA(0, sizeof(might_use_tail_padding) == 32); 211*f4a2713aSLionel Sambuc } 212*f4a2713aSLionel Sambuc 213*f4a2713aSLionel Sambuc namespace test6 { 214*f4a2713aSLionel Sambuc struct pod_in_11_only { 215*f4a2713aSLionel Sambuc private: 216*f4a2713aSLionel Sambuc long long x; 217*f4a2713aSLionel Sambuc }; 218*f4a2713aSLionel Sambuc 219*f4a2713aSLionel Sambuc struct pod_in_11_only2 { 220*f4a2713aSLionel Sambuc private: 221*f4a2713aSLionel Sambuc long long x; 222*f4a2713aSLionel Sambuc }; 223*f4a2713aSLionel Sambuc 224*f4a2713aSLionel Sambuc struct tail_padded_pod_in_11_only { 225*f4a2713aSLionel Sambuc pod_in_11_only pod11; 226*f4a2713aSLionel Sambuc char tail_padding; 227*f4a2713aSLionel Sambuc }; 228*f4a2713aSLionel Sambuc 229*f4a2713aSLionel Sambuc struct second_base { 230*f4a2713aSLionel Sambuc pod_in_11_only2 two; 231*f4a2713aSLionel Sambuc char foo; 232*f4a2713aSLionel Sambuc }; 233*f4a2713aSLionel Sambuc 234*f4a2713aSLionel Sambuc struct might_use_tail_padding : public tail_padded_pod_in_11_only, public second_base { 235*f4a2713aSLionel Sambuc char may_go_into_tail_padding; 236*f4a2713aSLionel Sambuc }; 237*f4a2713aSLionel Sambuc SA(0, sizeof(might_use_tail_padding) == 32); 238*f4a2713aSLionel Sambuc } 239*f4a2713aSLionel Sambuc 240*f4a2713aSLionel Sambuc namespace test7 { 241*f4a2713aSLionel Sambuc struct pod_in_11_only { 242*f4a2713aSLionel Sambuc private: 243*f4a2713aSLionel Sambuc long long x; 244*f4a2713aSLionel Sambuc }; 245*f4a2713aSLionel Sambuc 246*f4a2713aSLionel Sambuc struct tail_padded_pod_in_11_only { 247*f4a2713aSLionel Sambuc pod_in_11_only pod11; 248*f4a2713aSLionel Sambuc pod_in_11_only pod12; 249*f4a2713aSLionel Sambuc char tail_padding; 250*f4a2713aSLionel Sambuc }; 251*f4a2713aSLionel Sambuc 252*f4a2713aSLionel Sambuc struct might_use_tail_padding : public tail_padded_pod_in_11_only { 253*f4a2713aSLionel Sambuc char may_go_into_tail_padding; 254*f4a2713aSLionel Sambuc }; 255*f4a2713aSLionel Sambuc 256*f4a2713aSLionel Sambuc SA(0, sizeof(might_use_tail_padding) == 24); 257*f4a2713aSLionel Sambuc } 258*f4a2713aSLionel Sambuc 259*f4a2713aSLionel Sambuc namespace test8 { 260*f4a2713aSLionel Sambuc struct pod_in_11_only { 261*f4a2713aSLionel Sambuc private: 262*f4a2713aSLionel Sambuc long long x; 263*f4a2713aSLionel Sambuc }; 264*f4a2713aSLionel Sambuc 265*f4a2713aSLionel Sambuc struct tail_padded_pod_in_11_only { 266*f4a2713aSLionel Sambuc pod_in_11_only pod11; 267*f4a2713aSLionel Sambuc char tail_padding; 268*f4a2713aSLionel Sambuc }; 269*f4a2713aSLionel Sambuc 270*f4a2713aSLionel Sambuc struct another_layer { 271*f4a2713aSLionel Sambuc tail_padded_pod_in_11_only pod; 272*f4a2713aSLionel Sambuc char padding; 273*f4a2713aSLionel Sambuc }; 274*f4a2713aSLionel Sambuc 275*f4a2713aSLionel Sambuc struct might_use_tail_padding : public another_layer { 276*f4a2713aSLionel Sambuc char may_go_into_tail_padding; 277*f4a2713aSLionel Sambuc }; 278*f4a2713aSLionel Sambuc 279*f4a2713aSLionel Sambuc SA(0, sizeof(might_use_tail_padding) == 24); 280*f4a2713aSLionel Sambuc } 281*f4a2713aSLionel Sambuc 282*f4a2713aSLionel Sambuc namespace test9 { 283*f4a2713aSLionel Sambuc struct pod_in_11_only { 284*f4a2713aSLionel Sambuc private: 285*f4a2713aSLionel Sambuc long long x; 286*f4a2713aSLionel Sambuc }; 287*f4a2713aSLionel Sambuc 288*f4a2713aSLionel Sambuc struct tail_padded_pod_in_11_only { 289*f4a2713aSLionel Sambuc pod_in_11_only pod11; 290*f4a2713aSLionel Sambuc char tail_padding; 291*f4a2713aSLionel Sambuc }; 292*f4a2713aSLionel Sambuc 293*f4a2713aSLionel Sambuc struct another_layer : tail_padded_pod_in_11_only { 294*f4a2713aSLionel Sambuc }; 295*f4a2713aSLionel Sambuc 296*f4a2713aSLionel Sambuc struct might_use_tail_padding : public another_layer { 297*f4a2713aSLionel Sambuc char may_go_into_tail_padding; 298*f4a2713aSLionel Sambuc }; 299*f4a2713aSLionel Sambuc 300*f4a2713aSLionel Sambuc SA(0, sizeof(might_use_tail_padding) == 16); 301*f4a2713aSLionel Sambuc } 302*f4a2713aSLionel Sambuc 303*f4a2713aSLionel Sambuc namespace test10 { 304*f4a2713aSLionel Sambuc struct pod_in_11_only { 305*f4a2713aSLionel Sambuc private: 306*f4a2713aSLionel Sambuc long long x; 307*f4a2713aSLionel Sambuc }; 308*f4a2713aSLionel Sambuc 309*f4a2713aSLionel Sambuc struct A { 310*f4a2713aSLionel Sambuc pod_in_11_only a; 311*f4a2713aSLionel Sambuc char apad; 312*f4a2713aSLionel Sambuc }; 313*f4a2713aSLionel Sambuc 314*f4a2713aSLionel Sambuc struct B { 315*f4a2713aSLionel Sambuc char b; 316*f4a2713aSLionel Sambuc }; 317*f4a2713aSLionel Sambuc 318*f4a2713aSLionel Sambuc struct C { 319*f4a2713aSLionel Sambuc pod_in_11_only c; 320*f4a2713aSLionel Sambuc char cpad; 321*f4a2713aSLionel Sambuc }; 322*f4a2713aSLionel Sambuc 323*f4a2713aSLionel Sambuc struct D { 324*f4a2713aSLionel Sambuc char d; 325*f4a2713aSLionel Sambuc }; 326*f4a2713aSLionel Sambuc 327*f4a2713aSLionel Sambuc struct might_use_tail_padding : public A, public B, public C, public D { 328*f4a2713aSLionel Sambuc }; 329*f4a2713aSLionel Sambuc 330*f4a2713aSLionel Sambuc SA(0, sizeof(might_use_tail_padding) == 32); 331*f4a2713aSLionel Sambuc } 332*f4a2713aSLionel Sambuc 333*f4a2713aSLionel Sambuc namespace test11 { 334*f4a2713aSLionel Sambuc struct pod_in_11_only { 335*f4a2713aSLionel Sambuc private: 336*f4a2713aSLionel Sambuc long long x; 337*f4a2713aSLionel Sambuc }; 338*f4a2713aSLionel Sambuc 339*f4a2713aSLionel Sambuc struct A { 340*f4a2713aSLionel Sambuc pod_in_11_only a; 341*f4a2713aSLionel Sambuc char apad; 342*f4a2713aSLionel Sambuc }; 343*f4a2713aSLionel Sambuc 344*f4a2713aSLionel Sambuc struct B { 345*f4a2713aSLionel Sambuc char b_pre; 346*f4a2713aSLionel Sambuc pod_in_11_only b; 347*f4a2713aSLionel Sambuc char bpad; 348*f4a2713aSLionel Sambuc }; 349*f4a2713aSLionel Sambuc 350*f4a2713aSLionel Sambuc struct C { 351*f4a2713aSLionel Sambuc char c_pre; 352*f4a2713aSLionel Sambuc pod_in_11_only c; 353*f4a2713aSLionel Sambuc char cpad; 354*f4a2713aSLionel Sambuc }; 355*f4a2713aSLionel Sambuc 356*f4a2713aSLionel Sambuc struct D { 357*f4a2713aSLionel Sambuc char d_pre; 358*f4a2713aSLionel Sambuc pod_in_11_only d; 359*f4a2713aSLionel Sambuc char dpad; 360*f4a2713aSLionel Sambuc }; 361*f4a2713aSLionel Sambuc 362*f4a2713aSLionel Sambuc struct might_use_tail_padding : public A, public B, public C, public D { 363*f4a2713aSLionel Sambuc char m; 364*f4a2713aSLionel Sambuc }; 365*f4a2713aSLionel Sambuc 366*f4a2713aSLionel Sambuc SA(0, sizeof(might_use_tail_padding) == 88); 367*f4a2713aSLionel Sambuc } 368*f4a2713aSLionel Sambuc 369*f4a2713aSLionel Sambuc namespace test12 { 370*f4a2713aSLionel Sambuc struct pod_in_11_only { 371*f4a2713aSLionel Sambuc private: 372*f4a2713aSLionel Sambuc long long x; 373*f4a2713aSLionel Sambuc }; 374*f4a2713aSLionel Sambuc 375*f4a2713aSLionel Sambuc struct A { 376*f4a2713aSLionel Sambuc pod_in_11_only a __attribute__((aligned(128))); 377*f4a2713aSLionel Sambuc }; 378*f4a2713aSLionel Sambuc 379*f4a2713aSLionel Sambuc struct B { 380*f4a2713aSLionel Sambuc char bpad; 381*f4a2713aSLionel Sambuc }; 382*f4a2713aSLionel Sambuc 383*f4a2713aSLionel Sambuc struct C { 384*f4a2713aSLionel Sambuc char cpad; 385*f4a2713aSLionel Sambuc }; 386*f4a2713aSLionel Sambuc 387*f4a2713aSLionel Sambuc struct D { 388*f4a2713aSLionel Sambuc char dpad; 389*f4a2713aSLionel Sambuc }; 390*f4a2713aSLionel Sambuc 391*f4a2713aSLionel Sambuc struct might_use_tail_padding : public A, public B, public C, public D { 392*f4a2713aSLionel Sambuc char m; 393*f4a2713aSLionel Sambuc }; 394*f4a2713aSLionel Sambuc SA(0, sizeof(might_use_tail_padding) == 128); 395*f4a2713aSLionel Sambuc } 396*f4a2713aSLionel Sambuc 397*f4a2713aSLionel Sambuc namespace test13 { 398*f4a2713aSLionel Sambuc struct pod_in_11_only { 399*f4a2713aSLionel Sambuc private: 400*f4a2713aSLionel Sambuc long long x; 401*f4a2713aSLionel Sambuc }; 402*f4a2713aSLionel Sambuc 403*f4a2713aSLionel Sambuc struct A { 404*f4a2713aSLionel Sambuc pod_in_11_only a; 405*f4a2713aSLionel Sambuc char apad; 406*f4a2713aSLionel Sambuc }; 407*f4a2713aSLionel Sambuc 408*f4a2713aSLionel Sambuc struct B { 409*f4a2713aSLionel Sambuc }; 410*f4a2713aSLionel Sambuc 411*f4a2713aSLionel Sambuc struct C { 412*f4a2713aSLionel Sambuc char c_pre; 413*f4a2713aSLionel Sambuc pod_in_11_only c; 414*f4a2713aSLionel Sambuc char cpad; 415*f4a2713aSLionel Sambuc }; 416*f4a2713aSLionel Sambuc 417*f4a2713aSLionel Sambuc struct D { 418*f4a2713aSLionel Sambuc }; 419*f4a2713aSLionel Sambuc 420*f4a2713aSLionel Sambuc struct might_use_tail_padding : public A, public B, public C, public D { 421*f4a2713aSLionel Sambuc char m; 422*f4a2713aSLionel Sambuc }; 423*f4a2713aSLionel Sambuc SA(0, sizeof(might_use_tail_padding) == 40); 424*f4a2713aSLionel Sambuc } 425*f4a2713aSLionel Sambuc 426*f4a2713aSLionel Sambuc namespace test14 { 427*f4a2713aSLionel Sambuc struct pod_in_11_only { 428*f4a2713aSLionel Sambuc private: 429*f4a2713aSLionel Sambuc long long x; 430*f4a2713aSLionel Sambuc }; 431*f4a2713aSLionel Sambuc 432*f4a2713aSLionel Sambuc struct A { 433*f4a2713aSLionel Sambuc pod_in_11_only a; 434*f4a2713aSLionel Sambuc char apad; 435*f4a2713aSLionel Sambuc }; 436*f4a2713aSLionel Sambuc 437*f4a2713aSLionel Sambuc struct might_use_tail_padding : public A { 438*f4a2713aSLionel Sambuc struct { 439*f4a2713aSLionel Sambuc int : 0; 440*f4a2713aSLionel Sambuc } x; 441*f4a2713aSLionel Sambuc }; 442*f4a2713aSLionel Sambuc SA(0, sizeof(might_use_tail_padding) == 16); 443*f4a2713aSLionel Sambuc } 444*f4a2713aSLionel Sambuc 445*f4a2713aSLionel Sambuc namespace test15 { 446*f4a2713aSLionel Sambuc struct pod_in_11_only { 447*f4a2713aSLionel Sambuc private: 448*f4a2713aSLionel Sambuc long long x; 449*f4a2713aSLionel Sambuc }; 450*f4a2713aSLionel Sambuc 451*f4a2713aSLionel Sambuc struct A { 452*f4a2713aSLionel Sambuc pod_in_11_only a; 453*f4a2713aSLionel Sambuc char apad; 454*f4a2713aSLionel Sambuc }; 455*f4a2713aSLionel Sambuc 456*f4a2713aSLionel Sambuc struct might_use_tail_padding : public A { 457*f4a2713aSLionel Sambuc struct { 458*f4a2713aSLionel Sambuc char a:1; 459*f4a2713aSLionel Sambuc char b:2; 460*f4a2713aSLionel Sambuc char c:2; 461*f4a2713aSLionel Sambuc char d:2; 462*f4a2713aSLionel Sambuc char e:1; 463*f4a2713aSLionel Sambuc } x; 464*f4a2713aSLionel Sambuc }; 465*f4a2713aSLionel Sambuc SA(0, sizeof(might_use_tail_padding) == 16); 466*f4a2713aSLionel Sambuc } 467*f4a2713aSLionel Sambuc 468*f4a2713aSLionel Sambuc namespace test16 { 469*f4a2713aSLionel Sambuc struct pod_in_11_only { 470*f4a2713aSLionel Sambuc private: 471*f4a2713aSLionel Sambuc long long x; 472*f4a2713aSLionel Sambuc }; 473*f4a2713aSLionel Sambuc 474*f4a2713aSLionel Sambuc struct A { 475*f4a2713aSLionel Sambuc pod_in_11_only a; 476*f4a2713aSLionel Sambuc char apad; 477*f4a2713aSLionel Sambuc }; 478*f4a2713aSLionel Sambuc 479*f4a2713aSLionel Sambuc struct B { 480*f4a2713aSLionel Sambuc char bpod; 481*f4a2713aSLionel Sambuc pod_in_11_only b; 482*f4a2713aSLionel Sambuc char bpad; 483*f4a2713aSLionel Sambuc }; 484*f4a2713aSLionel Sambuc 485*f4a2713aSLionel Sambuc struct C : public A, public B { 486*f4a2713aSLionel Sambuc }; 487*f4a2713aSLionel Sambuc 488*f4a2713aSLionel Sambuc struct D : public C { 489*f4a2713aSLionel Sambuc }; 490*f4a2713aSLionel Sambuc 491*f4a2713aSLionel Sambuc struct might_use_tail_padding : public D { 492*f4a2713aSLionel Sambuc char m; 493*f4a2713aSLionel Sambuc }; 494*f4a2713aSLionel Sambuc SA(0, sizeof(might_use_tail_padding) == 40); 495*f4a2713aSLionel Sambuc } 496*f4a2713aSLionel Sambuc 497*f4a2713aSLionel Sambuc namespace test17 { 498*f4a2713aSLionel Sambuc struct pod_in_11_only { 499*f4a2713aSLionel Sambuc private: 500*f4a2713aSLionel Sambuc long long x; 501*f4a2713aSLionel Sambuc }; 502*f4a2713aSLionel Sambuc 503*f4a2713aSLionel Sambuc struct A { 504*f4a2713aSLionel Sambuc pod_in_11_only a __attribute__((aligned(512))); 505*f4a2713aSLionel Sambuc }; 506*f4a2713aSLionel Sambuc 507*f4a2713aSLionel Sambuc struct B { 508*f4a2713aSLionel Sambuc char bpad; 509*f4a2713aSLionel Sambuc pod_in_11_only foo; 510*f4a2713aSLionel Sambuc char btail; 511*f4a2713aSLionel Sambuc }; 512*f4a2713aSLionel Sambuc 513*f4a2713aSLionel Sambuc struct C { 514*f4a2713aSLionel Sambuc char cpad; 515*f4a2713aSLionel Sambuc }; 516*f4a2713aSLionel Sambuc 517*f4a2713aSLionel Sambuc struct D { 518*f4a2713aSLionel Sambuc char dpad; 519*f4a2713aSLionel Sambuc }; 520*f4a2713aSLionel Sambuc 521*f4a2713aSLionel Sambuc struct might_use_tail_padding : public A, public B, public C, public D { 522*f4a2713aSLionel Sambuc char a; 523*f4a2713aSLionel Sambuc }; 524*f4a2713aSLionel Sambuc SA(0, sizeof(might_use_tail_padding) == 512); 525*f4a2713aSLionel Sambuc } 526*f4a2713aSLionel Sambuc 527*f4a2713aSLionel Sambuc namespace test18 { 528*f4a2713aSLionel Sambuc struct pod_in_11_only { 529*f4a2713aSLionel Sambuc private: 530*f4a2713aSLionel Sambuc long long x; 531*f4a2713aSLionel Sambuc }; 532*f4a2713aSLionel Sambuc 533*f4a2713aSLionel Sambuc struct A { 534*f4a2713aSLionel Sambuc pod_in_11_only a; 535*f4a2713aSLionel Sambuc char apad; 536*f4a2713aSLionel Sambuc }; 537*f4a2713aSLionel Sambuc 538*f4a2713aSLionel Sambuc struct B { 539*f4a2713aSLionel Sambuc char bpod; 540*f4a2713aSLionel Sambuc pod_in_11_only b; 541*f4a2713aSLionel Sambuc char bpad; 542*f4a2713aSLionel Sambuc }; 543*f4a2713aSLionel Sambuc 544*f4a2713aSLionel Sambuc struct A1 { 545*f4a2713aSLionel Sambuc pod_in_11_only a; 546*f4a2713aSLionel Sambuc char apad; 547*f4a2713aSLionel Sambuc }; 548*f4a2713aSLionel Sambuc 549*f4a2713aSLionel Sambuc struct B1 { 550*f4a2713aSLionel Sambuc char bpod; 551*f4a2713aSLionel Sambuc pod_in_11_only b; 552*f4a2713aSLionel Sambuc char bpad; 553*f4a2713aSLionel Sambuc }; 554*f4a2713aSLionel Sambuc 555*f4a2713aSLionel Sambuc struct C : public A, public B { 556*f4a2713aSLionel Sambuc }; 557*f4a2713aSLionel Sambuc 558*f4a2713aSLionel Sambuc struct D : public A1, public B1 { 559*f4a2713aSLionel Sambuc }; 560*f4a2713aSLionel Sambuc 561*f4a2713aSLionel Sambuc struct E : public D, public C { 562*f4a2713aSLionel Sambuc }; 563*f4a2713aSLionel Sambuc 564*f4a2713aSLionel Sambuc struct F : public E { 565*f4a2713aSLionel Sambuc }; 566*f4a2713aSLionel Sambuc 567*f4a2713aSLionel Sambuc struct might_use_tail_padding : public F { 568*f4a2713aSLionel Sambuc char m; 569*f4a2713aSLionel Sambuc }; 570*f4a2713aSLionel Sambuc SA(0, sizeof(might_use_tail_padding) == 80); 571*f4a2713aSLionel Sambuc } 572*f4a2713aSLionel Sambuc } // namespace PR16537 573