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