blob: ed3684280e88ff69dfdc107ecfc64742d832bb74 [file] [log] [blame]
Daniel Dunbard7d5f022009-03-24 02:24:46 +00001// RUN: clang-cc -triple i386-unknown-unknown %s -emit-llvm -o -
Devang Patelb9b00ad2007-10-23 20:28:39 +00002
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}
Devang Patelb1e39892007-10-23 23:26:46 +000040
41/* Nested structs */
42typedef struct NA {
43 int data;
44 struct NA *next;
45} NA;
Devang Pateldbb46b12007-10-23 23:29:51 +000046void f1() { NA a; }
Devang Patelb1e39892007-10-23 23:26:46 +000047
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
Devang Patel126a8562007-10-24 22:26:28 +000058extern NB *f3();
59void f4() {
60 f3()->d1 = 42;
61}
Devang Patel0a961182007-10-26 18:15:21 +000062
63void f5() {
64 (f3())->d1 = 42;
65}
Anders Carlsson148fe672007-10-31 22:04:46 +000066
67/* Function calls */
68typedef struct {
69 int location;
70 int length;
71} range;
Anders Carlsson148fe672007-10-31 22:04:46 +000072extern range f6();
73void f7()
74{
Anders Carlssona1ff3e92007-11-02 16:59:10 +000075 range r = f6();
76}
77
78/* Member expressions */
79typedef struct {
80 range range1;
81 range range2;
82} rangepair;
83
84void f8()
85{
86 rangepair p;
87
88 range r = p.range1;
Anders Carlsson148fe672007-10-31 22:04:46 +000089}
90
Seo Sanghyeon7777bb22007-12-14 01:09:11 +000091void f9(range *p)
92{
93 range r = *p;
94}
Anders Carlsson148fe672007-10-31 22:04:46 +000095
Seo Sanghyeon9b73b392007-12-14 02:04:12 +000096void f10(range *p)
97{
98 range r = p[0];
99}
100
Devang Patel14c75002007-12-10 18:25:34 +0000101/* _Bool types */
102
103struct _w
104{
105 short a,b;
106 short c,d;
107 short e,f;
108 short g;
109
110 unsigned int h,i;
111
112 _Bool j,k;
113} ws;
Anders Carlssone4707ff2008-01-14 06:28:57 +0000114
115/* Implicit casts (due to typedefs) */
116typedef struct _a
117{
118 int a;
119} a;
120
121void f11()
122{
123 struct _a a1;
124 a a2;
125
126 a1 = a2;
127 a2 = a1;
128}
Anders Carlssona46b7592008-01-18 02:25:57 +0000129
130/* Implicit casts (due to const) */
131void f12()
132{
133 struct _a a1;
134 const struct _a a2;
135
136 a1 = a2;
Devang Patel47fb6972008-01-29 23:23:18 +0000137}
138
139/* struct initialization */
Eli Friedman75afb582008-02-06 05:33:51 +0000140struct a13 {int b; int c;};
Devang Patel47fb6972008-01-29 23:23:18 +0000141struct a13 c13 = {5};
Devang Patelbf20b682008-05-27 22:44:22 +0000142typedef struct a13 a13;
Devang Pateleae15602008-02-05 02:39:50 +0000143struct a14 { short a; int b; } x = {1, 1};
Eli Friedman75afb582008-02-06 05:33:51 +0000144
145/* flexible array members */
146struct a15 {char a; int b[];} c15;
147int a16(void) {c15.a = 1;}
Eli Friedmanb1851242008-05-27 15:51:49 +0000148
149/* compound literals */
150void f13()
151{
152 a13 x; x = (a13){1,2};
153}
154
155/* va_arg */
156int f14(int i, ...) {
157 __builtin_va_list l;
158 __builtin_va_start(l,i);
159 a13 b = __builtin_va_arg(l, a13);
Daniel Dunbar4dc346e2009-02-12 08:41:10 +0000160 int c = __builtin_va_arg(l, a13).c;
Eli Friedmanb1851242008-05-27 15:51:49 +0000161 return b.b;
162}
Devang Patel2fb86e62008-05-27 22:45:40 +0000163
164/* Attribute packed */
165struct __attribute__((packed)) S2839 { double a[19]; signed char b; } s2839[5];
Eli Friedman0408f682008-05-29 10:58:49 +0000166
167struct __attribute__((packed)) SS { long double a; char b; } SS;
168
Daniel Dunbar80e62c22008-09-04 03:20:13 +0000169
170/* As lvalue */
171
172int f15() {
173 extern range f15_ext();
174 return f15_ext().location;
175}
176
177range f16() {
178 extern rangepair f16_ext();
179 return f16_ext().range1;
180}
181
182int f17() {
183 extern range f17_ext();
184 range r;
185 return (r = f17_ext()).location;
186}
187
188range f18() {
189 extern rangepair f18_ext();
190 rangepair rp;
191 return (rp = f18_ext()).range1;
192}