Home | History | Annotate | Download | only in CodeGenCXX
      1 // REQUIRES: aarch64-registered-target
      2 // RUN: %clang_cc1 -triple aarch64-linux-gnu -x c++ -std=c++1z %s -verify
      3 // expected-no-diagnostics
      4 
      5 #include <stddef.h>
      6 
      7 struct t1
      8 {
      9   int foo : 1;
     10   char : 0;
     11   char bar;
     12 
     13 };
     14 static_assert(offsetof(struct t1, bar) == 1);
     15 static_assert(sizeof(struct t1) == 4);
     16 
     17 struct t2
     18 {
     19   int foo : 1;
     20   short : 0;
     21   char bar;
     22 };
     23 static_assert(offsetof(struct t2, bar) == 2);
     24 static_assert(sizeof(struct t2) == 4);
     25 
     26 struct t3
     27 {
     28   int foo : 1;
     29   int : 0;
     30   char bar;
     31 };
     32 static_assert(offsetof(struct t3, bar) == 4);
     33 static_assert(sizeof(struct t3) == 8);
     34 
     35 struct t4
     36 {
     37   int foo : 1;
     38   long : 0;
     39   char bar;
     40 };
     41 static_assert(offsetof(struct t4, bar) == 8);
     42 static_assert(sizeof(struct t4) == 16);
     43 
     44 struct t5
     45 {
     46   int foo : 1;
     47   long long : 0;
     48   char bar;
     49 };
     50 static_assert(offsetof(struct t5, bar) == 8);
     51 static_assert(sizeof(struct t5) == 16);
     52 
     53 struct t6
     54 {
     55   int foo : 1;
     56   char : 0;
     57   char bar : 1;
     58   char bar2;
     59 };
     60 static_assert(offsetof(struct t6, bar2) == 2);
     61 static_assert(sizeof(struct t6) == 4);
     62 
     63 struct t7
     64 {
     65   int foo : 1;
     66   short : 0;
     67   char bar1 : 1;
     68   char bar2;
     69 };
     70 static_assert(offsetof(struct t7, bar2) == 3);
     71 static_assert(sizeof(struct t7) == 4);
     72 
     73 struct t8
     74 {
     75   int foo : 1;
     76   int : 0;
     77   char bar1 : 1;
     78   char bar2;
     79 };
     80 static_assert(offsetof(struct t8, bar2) == 5);
     81 static_assert(sizeof(struct t8) == 8);
     82 
     83 struct t9
     84 {
     85   int foo : 1;
     86   long : 0;
     87   char bar1 : 1;
     88   char bar2;
     89 };
     90 static_assert(offsetof(struct t9, bar2) == 9);
     91 static_assert(sizeof(struct t9) == 16);
     92 
     93 struct t10
     94 {
     95   int foo : 1;
     96   long long : 0;
     97   char bar1 : 1;
     98   char bar2;
     99 };
    100 static_assert(offsetof(struct t10, bar2) == 9);
    101 static_assert(sizeof(struct t10) == 16);
    102 
    103 struct t11
    104 {
    105   int foo : 1;
    106   long long : 0;
    107   char : 0;
    108   char bar1 : 1;
    109   char bar2;
    110 };
    111 static_assert(offsetof(struct t11, bar2) == 9);
    112 static_assert(sizeof(struct t11) == 16);
    113 
    114 struct t12
    115 {
    116   int foo : 1;
    117   char : 0;
    118   long long : 0;
    119   char : 0;
    120   char bar;
    121 };
    122 static_assert(offsetof(struct t12, bar) == 8);
    123 static_assert(sizeof(struct t12) == 16);
    124 
    125 struct t13
    126 {
    127   char foo;
    128   long : 0;
    129   char bar;
    130 };
    131 static_assert(offsetof(struct t13, bar) == 8);
    132 static_assert(sizeof(struct t13) == 16);
    133 
    134 struct t14
    135 {
    136   char foo1;
    137   int : 0;
    138   char foo2 : 1;
    139   short foo3 : 16;
    140   char : 0;
    141   short foo4 : 16;
    142   char bar1;
    143   int : 0;
    144   char bar2;
    145 };
    146 static_assert(offsetof(struct t14, bar1) == 10);
    147 static_assert(offsetof(struct t14, bar2) == 12);
    148 static_assert(sizeof(struct t14) == 16);
    149 
    150 struct t15
    151 {
    152   char foo;
    153   char : 0;
    154   int : 0;
    155   char bar;
    156   long : 0;
    157   char : 0;
    158 };
    159 static_assert(offsetof(struct t15, bar) == 4);
    160 static_assert(sizeof(struct t15) == 8);
    161 
    162 struct t16
    163 {
    164   long : 0;
    165   char bar;
    166 };
    167 static_assert(offsetof(struct t16, bar) == 0);
    168 static_assert(sizeof(struct t16) == 8);
    169 
    170 struct t17
    171 {
    172   char foo;
    173   long : 0;
    174   long : 0;
    175   char : 0;
    176   char bar;
    177 };
    178 static_assert(offsetof(struct t17, bar) == 8);
    179 static_assert(sizeof(struct t17) == 16);
    180 
    181 struct t18
    182 {
    183   long : 0;
    184   long : 0;
    185   char : 0;
    186 };
    187 static_assert(sizeof(struct t18) == 8);
    188 
    189 struct t19
    190 {
    191   char foo1;
    192   long foo2 : 1;
    193   char : 0;
    194   long foo3 : 32;
    195   char bar;
    196 };
    197 static_assert(offsetof(struct t19, bar) == 6);
    198 static_assert(sizeof(struct t19) == 8);
    199 
    200 struct t20
    201 {
    202   short : 0;
    203   int foo : 1;
    204   long : 0;
    205   char bar;
    206 };
    207 static_assert(offsetof(struct t20, bar) == 8);
    208 static_assert(sizeof(struct t20) == 16);
    209 
    210 struct t21
    211 {
    212   short : 0;
    213   int foo1 : 1;
    214   char : 0;
    215   int foo2 : 16;
    216   long : 0;
    217   char bar1;
    218   int bar2;
    219   long bar3;
    220   char foo3 : 8;
    221   char : 0;
    222   long : 0;
    223   int foo4 : 32;
    224   short foo5: 1;
    225   long bar4;
    226   short foo6: 16;
    227   short foo7: 16;
    228   short foo8: 16;
    229 };
    230 static_assert(offsetof(struct t21, bar1) == 8);
    231 static_assert(offsetof(struct t21, bar2) == 12);
    232 static_assert(offsetof(struct t21, bar3) == 16);
    233 static_assert(offsetof(struct t21, bar4) == 40);
    234 static_assert(sizeof(struct t21) == 56);
    235 
    236 // The rules also apply to anonymous bitfields with non-zero length.
    237 struct t22
    238 {
    239   char foo;
    240   short :2;
    241   char bar;
    242 };
    243 static_assert(alignof(struct t22) == 2);
    244 static_assert(offsetof(struct t22, bar) == 2);
    245 
    246 int main() {
    247   return 0;
    248 }
    249 
    250