Home | History | Annotate | Download | only in Sema
      1 // RUN: %clang_cc1 %s -fsyntax-only -verify -triple=i686-apple-darwin9
      2 // RUN: %clang_cc1 %s -fsyntax-only -verify -triple=arm-linux-gnueabihf
      3 // RUN: %clang_cc1 %s -fsyntax-only -verify -triple=aarch64-linux-gnu
      4 // RUN: %clang_cc1 %s -fsyntax-only -verify -triple=x86_64-pc-linux-gnu
      5 // RUN: %clang_cc1 %s -fsyntax-only -verify -triple=x86_64-scei-ps4
      6 // expected-no-diagnostics
      7 #include <stddef.h>
      8 
      9 #define CHECK_SIZE(kind, name, size) \
     10   extern int name##_1[sizeof(kind name) == size ? 1 : -1];
     11 #define CHECK_ALIGN(kind, name, size) \
     12   extern int name##_2[__alignof(kind name) == size ? 1 : -1];
     13 #define CHECK_OFFSET(kind, name, member, offset) \
     14   extern int name##_3[offsetof(kind name, member) == offset ? 1 : -1];
     15 
     16 // Zero-width bit-fields
     17 struct a {char x; int : 0; char y;};
     18 #if defined(__arm__) || defined(__aarch64__)
     19 CHECK_SIZE(struct, a, 8)
     20 CHECK_ALIGN(struct, a, 4)
     21 #else
     22 CHECK_SIZE(struct, a, 5)
     23 CHECK_ALIGN(struct, a, 1)
     24 #endif
     25 
     26 // Zero-width bit-fields with packed
     27 struct __attribute__((packed)) a2 { short x : 9; char : 0; int y : 17; };
     28 CHECK_SIZE(struct, a2, 5)
     29 CHECK_ALIGN(struct, a2, 1)
     30 
     31 // Zero-width bit-fields at the end of packed struct
     32 struct __attribute__((packed)) a3 { short x : 9; int : 0; };
     33 #if defined(__arm__) || defined(__aarch64__)
     34 CHECK_SIZE(struct, a3, 4)
     35 CHECK_ALIGN(struct, a3, 4)
     36 #else
     37 CHECK_SIZE(struct, a3, 4)
     38 CHECK_ALIGN(struct, a3, 1)
     39 #endif
     40 
     41 // For comparison, non-zero-width bit-fields at the end of packed struct
     42 struct __attribute__((packed)) a4 { short x : 9; int : 1; };
     43 CHECK_SIZE(struct, a4, 2)
     44 CHECK_ALIGN(struct, a4, 1)
     45 
     46 union b {char x; int : 0; char y;};
     47 #if defined(__arm__) || defined(__aarch64__)
     48 CHECK_SIZE(union, b, 4)
     49 CHECK_ALIGN(union, b, 4)
     50 #else
     51 CHECK_SIZE(union, b, 1)
     52 CHECK_ALIGN(union, b, 1)
     53 #endif
     54 
     55 // Unnamed bit-field align
     56 struct c {char x; int : 20;};
     57 #if defined(__arm__) || defined(__aarch64__)
     58 CHECK_SIZE(struct, c, 4)
     59 CHECK_ALIGN(struct, c, 4)
     60 #else
     61 CHECK_SIZE(struct, c, 4)
     62 CHECK_ALIGN(struct, c, 1)
     63 #endif
     64 
     65 union d {char x; int : 20;};
     66 #if defined(__arm__) || defined(__aarch64__)
     67 CHECK_SIZE(union, d, 4)
     68 CHECK_ALIGN(union, d, 4)
     69 #else
     70 CHECK_SIZE(union, d, 3)
     71 CHECK_ALIGN(union, d, 1)
     72 #endif
     73 
     74 // Bit-field packing
     75 struct __attribute__((packed)) e {int x : 4, y : 30, z : 30;};
     76 CHECK_SIZE(struct, e, 8)
     77 CHECK_ALIGN(struct, e, 1)
     78 
     79 // Alignment on bit-fields
     80 struct f {__attribute((aligned(8))) int x : 30, y : 30, z : 30;};
     81 CHECK_SIZE(struct, f, 24)
     82 CHECK_ALIGN(struct, f, 8)
     83 
     84 // Large structure (overflows i32, in bits).
     85 struct s0 {
     86   char a[0x32100000];
     87   int x:30, y:30;
     88 };
     89 
     90 CHECK_SIZE(struct, s0, 0x32100008)
     91 CHECK_ALIGN(struct, s0, 4)
     92 
     93 // Bit-field with explicit align bigger than normal.
     94 struct g0 {
     95   char a;
     96   __attribute__((aligned(16))) int b : 1;
     97   char c;
     98 };
     99 
    100 #if defined(__ORBIS__)
    101 CHECK_SIZE(struct, g0, 16);
    102 CHECK_ALIGN(struct, g0, 16);
    103 CHECK_OFFSET(struct, g0, c, 2);
    104 #else
    105 CHECK_SIZE(struct, g0, 32);
    106 CHECK_ALIGN(struct, g0, 16);
    107 CHECK_OFFSET(struct, g0, c, 17);
    108 #endif
    109 
    110 // Bit-field with explicit align smaller than normal.
    111 struct g1 {
    112   char a;
    113   __attribute__((aligned(2))) int b : 1;
    114   char c;
    115 };
    116 
    117 CHECK_SIZE(struct, g1, 4);
    118 CHECK_ALIGN(struct, g1, 4);
    119 #if defined(__ORBIS__)
    120 CHECK_OFFSET(struct, g1, c, 2);
    121 #else
    122 CHECK_OFFSET(struct, g1, c, 3);
    123 #endif
    124 
    125 // Same as above but without explicit align.
    126 struct g2 {
    127   char a;
    128   int b : 1;
    129   char c;
    130 };
    131 
    132 CHECK_SIZE(struct, g2, 4);
    133 CHECK_ALIGN(struct, g2, 4);
    134 CHECK_OFFSET(struct, g2, c, 2);
    135 
    136 // Explicit attribute align on bit-field has precedence over packed attribute
    137 // applied too the struct.
    138 struct __attribute__((packed)) g3 {
    139   char a;
    140   __attribute__((aligned(16))) int b : 1;
    141   char c;
    142 };
    143 
    144 CHECK_ALIGN(struct, g3, 16);
    145 #if defined(__ORBIS__)
    146 CHECK_SIZE(struct, g3, 16);
    147 CHECK_OFFSET(struct, g3, c, 2);
    148 #else
    149 CHECK_SIZE(struct, g3, 32);
    150 CHECK_OFFSET(struct, g3, c, 17);
    151 #endif
    152 
    153 struct __attribute__((packed)) g4 {
    154   char a;
    155   __attribute__((aligned(2))) int b : 1;
    156   char c;
    157 };
    158 
    159 CHECK_SIZE(struct, g4, 4);
    160 CHECK_ALIGN(struct, g4, 2);
    161 #if defined(__ORBIS__)
    162 CHECK_OFFSET(struct, g4, c, 2);
    163 #else
    164 CHECK_OFFSET(struct, g4, c, 3);
    165 #endif
    166 
    167 struct g5 {
    168   char : 1;
    169   __attribute__((aligned(1))) int n : 24;
    170 };
    171 CHECK_SIZE(struct, g5, 4);
    172 CHECK_ALIGN(struct, g5, 4);
    173 
    174 struct __attribute__((packed)) g6 {
    175   char : 1;
    176   __attribute__((aligned(1))) int n : 24;
    177 };
    178 CHECK_SIZE(struct, g6, 4);
    179 CHECK_ALIGN(struct, g6, 1);
    180 
    181 struct g7 {
    182   char : 1;
    183   __attribute__((aligned(1))) int n : 25;
    184 };
    185 #if defined(__ORBIS__)
    186 CHECK_SIZE(struct, g7, 4);
    187 #else
    188 CHECK_SIZE(struct, g7, 8);
    189 #endif
    190 CHECK_ALIGN(struct, g7, 4);
    191 
    192 struct __attribute__((packed)) g8 {
    193   char : 1;
    194   __attribute__((aligned(1))) int n : 25;
    195 };
    196 #if defined(__ORBIS__)
    197 CHECK_SIZE(struct, g8, 4);
    198 #else
    199 CHECK_SIZE(struct, g8, 5);
    200 #endif
    201 CHECK_ALIGN(struct, g8, 1);
    202 
    203 struct g9 {
    204   __attribute__((aligned(1))) char a : 2, b : 2, c : 2, d : 2, e : 2;
    205   int i;
    206 };
    207 #if defined(__ORBIS__)
    208 CHECK_SIZE(struct, g9, 8);
    209 #else
    210 CHECK_SIZE(struct, g9, 12);
    211 #endif
    212 CHECK_ALIGN(struct, g9, 4);
    213 
    214 struct __attribute__((packed)) g10 {
    215   __attribute__((aligned(1))) char a : 2, b : 2, c : 2, d : 2, e : 2;
    216   int i;
    217 };
    218 #if defined(__ORBIS__)
    219 CHECK_SIZE(struct, g10, 6);
    220 #else
    221 CHECK_SIZE(struct, g10, 9);
    222 #endif
    223 CHECK_ALIGN(struct, g10, 1);
    224 
    225 struct g11 {
    226   char a;
    227   __attribute__((aligned(1))) long long b : 62;
    228   char c;
    229 };
    230 #if defined(__arm__) || defined(__aarch64__) || defined(__x86_64__)
    231 CHECK_SIZE(struct, g11, 24);
    232 CHECK_ALIGN(struct, g11, 8);
    233 CHECK_OFFSET(struct, g11, c, 16);
    234 #else
    235 CHECK_SIZE(struct, g11, 16);
    236 CHECK_ALIGN(struct, g11, 4);
    237 CHECK_OFFSET(struct, g11, c, 12);
    238 #endif
    239 
    240 struct __attribute__((packed)) g12 {
    241   char a;
    242   __attribute__((aligned(1))) long long b : 62;
    243   char c;
    244 };
    245 CHECK_SIZE(struct, g12, 10);
    246 CHECK_ALIGN(struct, g12, 1);
    247 CHECK_OFFSET(struct, g12, c, 9);
    248 
    249 struct g13 {
    250   char a;
    251   __attribute__((aligned(1))) long long : 0;
    252   char c;
    253 };
    254 #if defined(__arm__) || defined(__aarch64__)
    255 CHECK_SIZE(struct, g13, 16);
    256 CHECK_ALIGN(struct, g13, 8);
    257 CHECK_OFFSET(struct, g13, c, 8);
    258 #elif defined(__x86_64__)
    259 CHECK_SIZE(struct, g13, 9);
    260 CHECK_ALIGN(struct, g13, 1);
    261 CHECK_OFFSET(struct, g13, c, 8);
    262 #else
    263 CHECK_SIZE(struct, g13, 5);
    264 CHECK_ALIGN(struct, g13, 1);
    265 CHECK_OFFSET(struct, g13, c, 4);
    266 #endif
    267 
    268 struct __attribute__((packed)) g14 {
    269   char a;
    270   __attribute__((aligned(1))) long long : 0;
    271   char c;
    272 };
    273 #if defined(__arm__) || defined(__aarch64__)
    274 CHECK_SIZE(struct, g14, 16);
    275 CHECK_ALIGN(struct, g14, 8);
    276 CHECK_OFFSET(struct, g14, c, 8);
    277 #elif defined(__x86_64__)
    278 CHECK_SIZE(struct, g14, 9);
    279 CHECK_ALIGN(struct, g14, 1);
    280 CHECK_OFFSET(struct, g14, c, 8);
    281 #else
    282 CHECK_SIZE(struct, g14, 5);
    283 CHECK_ALIGN(struct, g14, 1);
    284 CHECK_OFFSET(struct, g14, c, 4);
    285 #endif
    286