1 // RUN: %clang_cc1 -triple i386-unknown-unknown %s -emit-llvm -o -
2 
3 struct  {
4   int x;
5   int y;
6 } point;
7 
fn1()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 
fn2()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 
fn3(F2 * c)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;
f1()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 
f2()56 void f2() { NB b; }
57 
58 extern NB *f3();
f4()59 void f4() {
60   f3()->d1 = 42;
61 }
62 
f5()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();
f7()73 void f7() {
74   range r = f6();
75 }
76 
77 /* Member expressions */
78 typedef struct {
79   range range1;
80   range range2;
81 } rangepair;
82 
f8()83 void f8() {
84   rangepair p;
85 
86   range r = p.range1;
87 }
88 
f9(range * p)89 void f9(range *p) {
90   range r = *p;
91 }
92 
f10(range * p)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 
f11()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) */
f12()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;
a16(void)139 int a16(void) {c15.a = 1;}
140 
141 /* compound literals */
f13()142 void f13() {
143   a13 x; x = (a13){1,2};
144 }
145 
146 /* va_arg */
f14(int i,...)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 
f15()163 int f15() {
164   extern range f15_ext();
165   return f15_ext().location;
166 }
167 
f16()168 range f16() {
169   extern rangepair f16_ext();
170   return f16_ext().range1;
171 }
172 
f17()173 int f17() {
174   extern range f17_ext();
175   range r;
176   return (r = f17_ext()).location;
177 }
178 
f18()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; };
f19(void)193 void f19(void) {
194   t.p();
195 }
196 
197