struct.c revision bf20b68e925f2b0e87eff0da49dae8a4dbc0fac7
1// RUN: clang %s -emit-llvm
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;
72
73extern range f6();
74void f7()
75{
76  range r = f6();
77}
78
79/* Member expressions */
80typedef struct {
81  range range1;
82  range range2;
83} rangepair;
84
85void f8()
86{
87  rangepair p;
88
89  range r = p.range1;
90}
91
92void f9(range *p)
93{
94  range r = *p;
95}
96
97void f10(range *p)
98{
99  range r = p[0];
100}
101
102/* _Bool types */
103
104struct _w
105{
106  short a,b;
107  short c,d;
108  short e,f;
109  short g;
110
111  unsigned int h,i;
112
113  _Bool j,k;
114} ws;
115
116/* Implicit casts (due to typedefs) */
117typedef struct _a
118{
119  int a;
120} a;
121
122void f11()
123{
124    struct _a a1;
125    a a2;
126
127    a1 = a2;
128    a2 = a1;
129}
130
131/* Implicit casts (due to const) */
132void f12()
133{
134	struct _a a1;
135	const struct _a a2;
136
137	a1 = a2;
138}
139
140/* struct initialization */
141struct a13 {int b; int c;};
142struct a13 c13 = {5};
143typedef struct a13 a13;
144struct a14 { short a; int b; } x = {1, 1};
145
146/* flexible array members */
147struct a15 {char a; int b[];} c15;
148int a16(void) {c15.a = 1;}
149
150/* compound literals */
151void f13()
152{
153  a13 x; x = (a13){1,2};
154}
155
156/* va_arg */
157int f14(int i, ...) {
158  __builtin_va_list l;
159  __builtin_va_start(l,i);
160  a13 b = __builtin_va_arg(l, a13);
161  return b.b;
162}
163