xref: /aosp_15_r20/external/clang/test/CodeGen/struct.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
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