1*67e74705SXin Li // RUN: %clang_cc1 %s -fsyntax-only -verify 2*67e74705SXin Li // RUN: %clang_cc1 %s -fsyntax-only -triple=x86_64-windows-coff -verify 3*67e74705SXin Li 4*67e74705SXin Li // Packed structs. 5*67e74705SXin Li struct s { 6*67e74705SXin Li char a; 7*67e74705SXin Li int b __attribute__((packed)); 8*67e74705SXin Li char c; 9*67e74705SXin Li int d; 10*67e74705SXin Li }; 11*67e74705SXin Li 12*67e74705SXin Li extern int a1[sizeof(struct s) == 12 ? 1 : -1]; 13*67e74705SXin Li extern int a2[__alignof(struct s) == 4 ? 1 : -1]; 14*67e74705SXin Li 15*67e74705SXin Li struct __attribute__((packed)) packed_s { 16*67e74705SXin Li char a; 17*67e74705SXin Li int b __attribute__((packed)); 18*67e74705SXin Li char c; 19*67e74705SXin Li int d; 20*67e74705SXin Li }; 21*67e74705SXin Li 22*67e74705SXin Li extern int b1[sizeof(struct packed_s) == 10 ? 1 : -1]; 23*67e74705SXin Li extern int b2[__alignof(struct packed_s) == 1 ? 1 : -1]; 24*67e74705SXin Li 25*67e74705SXin Li struct fas { 26*67e74705SXin Li char a; 27*67e74705SXin Li int b[]; 28*67e74705SXin Li }; 29*67e74705SXin Li 30*67e74705SXin Li extern int c1[sizeof(struct fas) == 4 ? 1 : -1]; 31*67e74705SXin Li extern int c2[__alignof(struct fas) == 4 ? 1 : -1]; 32*67e74705SXin Li 33*67e74705SXin Li struct __attribute__((packed)) packed_fas { 34*67e74705SXin Li char a; 35*67e74705SXin Li int b[]; 36*67e74705SXin Li }; 37*67e74705SXin Li 38*67e74705SXin Li extern int d1[sizeof(struct packed_fas) == 1 ? 1 : -1]; 39*67e74705SXin Li extern int d2[__alignof(struct packed_fas) == 1 ? 1 : -1]; 40*67e74705SXin Li 41*67e74705SXin Li struct packed_after_fas { 42*67e74705SXin Li char a; 43*67e74705SXin Li int b[]; 44*67e74705SXin Li } __attribute__((packed)); 45*67e74705SXin Li 46*67e74705SXin Li extern int d1_2[sizeof(struct packed_after_fas) == 1 ? 1 : -1]; 47*67e74705SXin Li extern int d2_2[__alignof(struct packed_after_fas) == 1 ? 1 : -1]; 48*67e74705SXin Li 49*67e74705SXin Li // Alignment 50*67e74705SXin Li 51*67e74705SXin Li struct __attribute__((aligned(8))) as1 { 52*67e74705SXin Li char c; 53*67e74705SXin Li }; 54*67e74705SXin Li 55*67e74705SXin Li extern int e1[sizeof(struct as1) == 8 ? 1 : -1]; 56*67e74705SXin Li extern int e2[__alignof(struct as1) == 8 ? 1 : -1]; 57*67e74705SXin Li 58*67e74705SXin Li struct __attribute__((aligned)) as1_2 { 59*67e74705SXin Li char c; 60*67e74705SXin Li }; 61*67e74705SXin Li #ifdef __s390x__ 62*67e74705SXin Li extern int e1_2[sizeof(struct as1_2) == 8 ? 1 : -1]; 63*67e74705SXin Li extern int e2_2[__alignof(struct as1_2) == 8 ? 1 : -1]; 64*67e74705SXin Li #else 65*67e74705SXin Li extern int e1_2[sizeof(struct as1_2) == 16 ? 1 : -1]; 66*67e74705SXin Li extern int e2_2[__alignof(struct as1_2) == 16 ? 1 : -1]; 67*67e74705SXin Li #endif 68*67e74705SXin Li 69*67e74705SXin Li struct as2 { 70*67e74705SXin Li char c; 71*67e74705SXin Li int __attribute__((aligned(8))) a; 72*67e74705SXin Li }; 73*67e74705SXin Li 74*67e74705SXin Li extern int f1[sizeof(struct as2) == 16 ? 1 : -1]; 75*67e74705SXin Li extern int f2[__alignof(struct as2) == 8 ? 1 : -1]; 76*67e74705SXin Li 77*67e74705SXin Li struct __attribute__((packed)) as3 { 78*67e74705SXin Li char c; 79*67e74705SXin Li int a; 80*67e74705SXin Li int __attribute__((aligned(8))) b; 81*67e74705SXin Li }; 82*67e74705SXin Li 83*67e74705SXin Li extern int g1[sizeof(struct as3) == 16 ? 1 : -1]; 84*67e74705SXin Li extern int g2[__alignof(struct as3) == 8 ? 1 : -1]; 85*67e74705SXin Li 86*67e74705SXin Li 87*67e74705SXin Li // rdar://5921025 88*67e74705SXin Li struct packedtest { 89*67e74705SXin Li int ted_likes_cheese; 90*67e74705SXin Li void *args[] __attribute__((packed)); 91*67e74705SXin Li }; 92*67e74705SXin Li 93*67e74705SXin Li // Packed union 94*67e74705SXin Li union __attribute__((packed)) au4 {char c; int x;}; 95*67e74705SXin Li extern int h1[sizeof(union au4) == 4 ? 1 : -1]; 96*67e74705SXin Li extern int h2[__alignof(union au4) == 1 ? 1 : -1]; 97*67e74705SXin Li 98*67e74705SXin Li // Aligned union 99*67e74705SXin Li union au5 {__attribute__((aligned(4))) char c;}; 100*67e74705SXin Li extern int h1[sizeof(union au5) == 4 ? 1 : -1]; 101*67e74705SXin Li extern int h2[__alignof(union au5) == 4 ? 1 : -1]; 102*67e74705SXin Li 103*67e74705SXin Li // Alignment+packed 104*67e74705SXin Li struct as6 {char c; __attribute__((packed, aligned(2))) int x;}; 105*67e74705SXin Li extern int i1[sizeof(struct as6) == 6 ? 1 : -1]; 106*67e74705SXin Li extern int i2[__alignof(struct as6) == 2 ? 1 : -1]; 107*67e74705SXin Li 108*67e74705SXin Li union au6 {char c; __attribute__((packed, aligned(2))) int x;}; 109*67e74705SXin Li extern int k1[sizeof(union au6) == 4 ? 1 : -1]; 110*67e74705SXin Li extern int k2[__alignof(union au6) == 2 ? 1 : -1]; 111*67e74705SXin Li 112*67e74705SXin Li // Check postfix attributes 113*67e74705SXin Li union au7 {char c; int x;} __attribute__((packed)); 114*67e74705SXin Li extern int l1[sizeof(union au7) == 4 ? 1 : -1]; 115*67e74705SXin Li extern int l2[__alignof(union au7) == 1 ? 1 : -1]; 116*67e74705SXin Li 117*67e74705SXin Li struct packed_fas2 { 118*67e74705SXin Li char a; 119*67e74705SXin Li int b[]; 120*67e74705SXin Li } __attribute__((packed)); 121*67e74705SXin Li 122*67e74705SXin Li extern int m1[sizeof(struct packed_fas2) == 1 ? 1 : -1]; 123*67e74705SXin Li extern int m2[__alignof(struct packed_fas2) == 1 ? 1 : -1]; 124*67e74705SXin Li 125*67e74705SXin Li // Attribute aligned can round down typedefs. PR9253 126*67e74705SXin Li typedef long long __attribute__((aligned(1))) nt; 127*67e74705SXin Li 128*67e74705SXin Li struct nS { 129*67e74705SXin Li char buf_nr; 130*67e74705SXin Li nt start_lba; 131*67e74705SXin Li }; 132*67e74705SXin Li 133*67e74705SXin Li #if defined(_WIN32) && !defined(__declspec) // _MSC_VER is unavailable in cc1. 134*67e74705SXin Li // Alignment doesn't affect packing in MS mode. 135*67e74705SXin Li extern int n1[sizeof(struct nS) == 16 ? 1 : -1]; 136*67e74705SXin Li extern int n2[__alignof(struct nS) == 8 ? 1 : -1]; 137*67e74705SXin Li #else 138*67e74705SXin Li extern int n1[sizeof(struct nS) == 9 ? 1 : -1]; 139*67e74705SXin Li extern int n2[__alignof(struct nS) == 1 ? 1 : -1]; 140*67e74705SXin Li #endif 141*67e74705SXin Li 142*67e74705SXin Li // Packed attribute shouldn't be ignored for bit-field of char types. 143*67e74705SXin Li // Note from GCC reference manual: The 4.1, 4.2 and 4.3 series of GCC ignore 144*67e74705SXin Li // the packed attribute on bit-fields of type char. This has been fixed in 145*67e74705SXin Li // GCC 4.4 but the change can lead to differences in the structure layout. 146*67e74705SXin Li // See the documentation of -Wpacked-bitfield-compat for more information. 147*67e74705SXin Li struct packed_chars { 148*67e74705SXin Li char a:4; 149*67e74705SXin Li char b:8 __attribute__ ((packed)); 150*67e74705SXin Li // expected-warning@-1 {{'packed' attribute was ignored on bit-fields with single-byte alignment in older versions of GCC and Clang}} 151*67e74705SXin Li char c:4; 152*67e74705SXin Li }; 153*67e74705SXin Li 154*67e74705SXin Li #if defined(_WIN32) && !defined(__declspec) // _MSC_VER is unavailable in cc1. 155*67e74705SXin Li // On Windows clang uses MSVC compatible layout in this case. 156*67e74705SXin Li extern int o1[sizeof(struct packed_chars) == 3 ? 1 : -1]; 157*67e74705SXin Li extern int o2[__alignof(struct packed_chars) == 1 ? 1 : -1]; 158*67e74705SXin Li #else 159*67e74705SXin Li extern int o1[sizeof(struct packed_chars) == 2 ? 1 : -1]; 160*67e74705SXin Li extern int o2[__alignof(struct packed_chars) == 1 ? 1 : -1]; 161*67e74705SXin Li #endif 162