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