• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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