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