1 // RUN: %clang_cc1 %s -fsyntax-only -verify 2 3 // Packed structs. 4 struct s { 5 char a; 6 int b __attribute__((packed)); 7 char c; 8 int d; 9 }; 10 11 extern int a1[sizeof(struct s) == 12 ? 1 : -1]; 12 extern int a2[__alignof(struct s) == 4 ? 1 : -1]; 13 14 struct __attribute__((packed)) packed_s { 15 char a; 16 int b __attribute__((packed)); 17 char c; 18 int d; 19 }; 20 21 extern int b1[sizeof(struct packed_s) == 10 ? 1 : -1]; 22 extern int b2[__alignof(struct packed_s) == 1 ? 1 : -1]; 23 24 struct fas { 25 char a; 26 int b[]; 27 }; 28 29 extern int c1[sizeof(struct fas) == 4 ? 1 : -1]; 30 extern int c2[__alignof(struct fas) == 4 ? 1 : -1]; 31 32 struct __attribute__((packed)) packed_fas { 33 char a; 34 int b[]; 35 }; 36 37 extern int d1[sizeof(struct packed_fas) == 1 ? 1 : -1]; 38 extern int d2[__alignof(struct packed_fas) == 1 ? 1 : -1]; 39 40 struct packed_after_fas { 41 char a; 42 int b[]; 43 } __attribute__((packed)); 44 45 extern int d1_2[sizeof(struct packed_after_fas) == 1 ? 1 : -1]; 46 extern int d2_2[__alignof(struct packed_after_fas) == 1 ? 1 : -1]; 47 48 // Alignment 49 50 struct __attribute__((aligned(8))) as1 { 51 char c; 52 }; 53 54 extern int e1[sizeof(struct as1) == 8 ? 1 : -1]; 55 extern int e2[__alignof(struct as1) == 8 ? 1 : -1]; 56 57 // FIXME: Will need to force arch once max usable alignment isn't hard 58 // coded. 59 struct __attribute__((aligned)) as1_2 { 60 char c; 61 }; 62 extern int e1_2[sizeof(struct as1_2) == 16 ? 1 : -1]; 63 extern int e2_2[__alignof(struct as1_2) == 16 ? 1 : -1]; 64 65 struct as2 { 66 char c; 67 int __attribute__((aligned(8))) a; 68 }; 69 70 extern int f1[sizeof(struct as2) == 16 ? 1 : -1]; 71 extern int f2[__alignof(struct as2) == 8 ? 1 : -1]; 72 73 struct __attribute__((packed)) as3 { 74 char c; 75 int a; 76 int __attribute__((aligned(8))) b; 77 }; 78 79 extern int g1[sizeof(struct as3) == 16 ? 1 : -1]; 80 extern int g2[__alignof(struct as3) == 8 ? 1 : -1]; 81 82 83 // rdar://5921025 84 struct packedtest { 85 int ted_likes_cheese; 86 void *args[] __attribute__((packed)); 87 }; 88 89 // Packed union 90 union __attribute__((packed)) au4 {char c; int x;}; 91 extern int h1[sizeof(union au4) == 4 ? 1 : -1]; 92 extern int h2[__alignof(union au4) == 1 ? 1 : -1]; 93 94 // Aligned union 95 union au5 {__attribute__((aligned(4))) char c;}; 96 extern int h1[sizeof(union au5) == 4 ? 1 : -1]; 97 extern int h2[__alignof(union au5) == 4 ? 1 : -1]; 98 99 // Alignment+packed 100 struct as6 {char c; __attribute__((packed, aligned(2))) int x;}; 101 extern int i1[sizeof(struct as6) == 6 ? 1 : -1]; 102 extern int i2[__alignof(struct as6) == 2 ? 1 : -1]; 103 104 union au6 {char c; __attribute__((packed, aligned(2))) int x;}; 105 extern int k1[sizeof(union au6) == 4 ? 1 : -1]; 106 extern int k2[__alignof(union au6) == 2 ? 1 : -1]; 107 108 // Check postfix attributes 109 union au7 {char c; int x;} __attribute__((packed)); 110 extern int l1[sizeof(union au7) == 4 ? 1 : -1]; 111 extern int l2[__alignof(union au7) == 1 ? 1 : -1]; 112 113 struct packed_fas2 { 114 char a; 115 int b[]; 116 } __attribute__((packed)); 117 118 extern int m1[sizeof(struct packed_fas2) == 1 ? 1 : -1]; 119 extern int m2[__alignof(struct packed_fas2) == 1 ? 1 : -1]; 120 121 // Attribute aligned can round down typedefs. PR9253 122 typedef long long __attribute__((aligned(1))) nt; 123 124 struct nS { 125 char buf_nr; 126 nt start_lba; 127 }; 128 129 extern int n1[sizeof(struct nS) == 9 ? 1 : -1]; 130 extern int n2[__alignof(struct nS) == 1 ? 1 : -1]; 131 132 133 134 135