Clang Project

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