1 | // RUN: %clang_cc1 -triple i386-unknown-unknown %s -emit-llvm -o - |
2 | |
3 | struct { |
4 | int x; |
5 | int y; |
6 | } point; |
7 | |
8 | void fn1() { |
9 | point.x = 42; |
10 | } |
11 | |
12 | /* Nested member */ |
13 | struct { |
14 | struct { |
15 | int a; |
16 | int b; |
17 | } p1; |
18 | } point2; |
19 | |
20 | void fn2() { |
21 | point2.p1.a = 42; |
22 | } |
23 | |
24 | /* Indirect reference */ |
25 | typedef struct __sf { |
26 | unsigned char *c; |
27 | short flags; |
28 | } F; |
29 | |
30 | typedef struct __sf2 { |
31 | F *ff; |
32 | } F2; |
33 | |
34 | int fn3(F2 *c) { |
35 | if (c->ff->c >= 0) |
36 | return 1; |
37 | else |
38 | return 0; |
39 | } |
40 | |
41 | /* Nested structs */ |
42 | typedef struct NA { |
43 | int data; |
44 | struct NA *next; |
45 | } NA; |
46 | void f1() { NA a; } |
47 | |
48 | typedef struct NB { |
49 | int d1; |
50 | struct _B2 { |
51 | int d2; |
52 | struct NB *n2; |
53 | } B2; |
54 | } NB; |
55 | |
56 | void f2() { NB b; } |
57 | |
58 | extern NB *f3(); |
59 | void f4() { |
60 | f3()->d1 = 42; |
61 | } |
62 | |
63 | void f5() { |
64 | (f3())->d1 = 42; |
65 | } |
66 | |
67 | /* Function calls */ |
68 | typedef struct { |
69 | int location; |
70 | int length; |
71 | } range; |
72 | extern range f6(); |
73 | void f7() { |
74 | range r = f6(); |
75 | } |
76 | |
77 | /* Member expressions */ |
78 | typedef struct { |
79 | range range1; |
80 | range range2; |
81 | } rangepair; |
82 | |
83 | void f8() { |
84 | rangepair p; |
85 | |
86 | range r = p.range1; |
87 | } |
88 | |
89 | void f9(range *p) { |
90 | range r = *p; |
91 | } |
92 | |
93 | void f10(range *p) { |
94 | range r = p[0]; |
95 | } |
96 | |
97 | /* _Bool types */ |
98 | |
99 | struct _w { |
100 | short a,b; |
101 | short c,d; |
102 | short e,f; |
103 | short g; |
104 | |
105 | unsigned int h,i; |
106 | |
107 | _Bool j,k; |
108 | } ws; |
109 | |
110 | /* Implicit casts (due to typedefs) */ |
111 | typedef struct _a { |
112 | int a; |
113 | } a; |
114 | |
115 | void f11() { |
116 | struct _a a1; |
117 | a a2; |
118 | |
119 | a1 = a2; |
120 | a2 = a1; |
121 | } |
122 | |
123 | /* Implicit casts (due to const) */ |
124 | void f12() { |
125 | struct _a a1; |
126 | const struct _a a2; |
127 | |
128 | a1 = a2; |
129 | } |
130 | |
131 | /* struct initialization */ |
132 | struct a13 {int b; int c;}; |
133 | struct a13 c13 = {5}; |
134 | typedef struct a13 a13; |
135 | struct a14 { short a; int b; } x = {1, 1}; |
136 | |
137 | /* flexible array members */ |
138 | struct a15 {char a; int b[];} c15; |
139 | int a16(void) {c15.a = 1;} |
140 | |
141 | /* compound literals */ |
142 | void f13() { |
143 | a13 x; x = (a13){1,2}; |
144 | } |
145 | |
146 | /* va_arg */ |
147 | int f14(int i, ...) { |
148 | __builtin_va_list l; |
149 | __builtin_va_start(l,i); |
150 | a13 b = __builtin_va_arg(l, a13); |
151 | int c = __builtin_va_arg(l, a13).c; |
152 | return b.b; |
153 | } |
154 | |
155 | /* Attribute packed */ |
156 | struct __attribute__((packed)) S2839 { double a[19]; signed char b; } s2839[5]; |
157 | |
158 | struct __attribute__((packed)) SS { long double a; char b; } SS; |
159 | |
160 | |
161 | /* As lvalue */ |
162 | |
163 | int f15() { |
164 | extern range f15_ext(); |
165 | return f15_ext().location; |
166 | } |
167 | |
168 | range f16() { |
169 | extern rangepair f16_ext(); |
170 | return f16_ext().range1; |
171 | } |
172 | |
173 | int f17() { |
174 | extern range f17_ext(); |
175 | range r; |
176 | return (r = f17_ext()).location; |
177 | } |
178 | |
179 | range f18() { |
180 | extern rangepair f18_ext(); |
181 | rangepair rp; |
182 | return (rp = f18_ext()).range1; |
183 | } |
184 | |
185 | |
186 | |
187 | // Complex forward reference of struct. |
188 | struct f19S; |
189 | extern struct f19T { |
190 | struct f19S (*p)(void); |
191 | } t; |
192 | struct f19S { int i; }; |
193 | void f19(void) { |
194 | t.p(); |
195 | } |
196 | |
197 | |