197 lines
2.6 KiB
C
197 lines
2.6 KiB
C
|
// RUN: %clang_cc1 -triple i386-unknown-unknown %s -emit-llvm -o -
|
||
|
|
||
|
struct {
|
||
|
int x;
|
||
|
int y;
|
||
|
} point;
|
||
|
|
||
|
void fn1() {
|
||
|
point.x = 42;
|
||
|
}
|
||
|
|
||
|
/* Nested member */
|
||
|
struct {
|
||
|
struct {
|
||
|
int a;
|
||
|
int b;
|
||
|
} p1;
|
||
|
} point2;
|
||
|
|
||
|
void fn2() {
|
||
|
point2.p1.a = 42;
|
||
|
}
|
||
|
|
||
|
/* Indirect reference */
|
||
|
typedef struct __sf {
|
||
|
unsigned char *c;
|
||
|
short flags;
|
||
|
} F;
|
||
|
|
||
|
typedef struct __sf2 {
|
||
|
F *ff;
|
||
|
} F2;
|
||
|
|
||
|
int fn3(F2 *c) {
|
||
|
if (c->ff->c >= 0)
|
||
|
return 1;
|
||
|
else
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
/* Nested structs */
|
||
|
typedef struct NA {
|
||
|
int data;
|
||
|
struct NA *next;
|
||
|
} NA;
|
||
|
void f1() { NA a; }
|
||
|
|
||
|
typedef struct NB {
|
||
|
int d1;
|
||
|
struct _B2 {
|
||
|
int d2;
|
||
|
struct NB *n2;
|
||
|
} B2;
|
||
|
} NB;
|
||
|
|
||
|
void f2() { NB b; }
|
||
|
|
||
|
extern NB *f3();
|
||
|
void f4() {
|
||
|
f3()->d1 = 42;
|
||
|
}
|
||
|
|
||
|
void f5() {
|
||
|
(f3())->d1 = 42;
|
||
|
}
|
||
|
|
||
|
/* Function calls */
|
||
|
typedef struct {
|
||
|
int location;
|
||
|
int length;
|
||
|
} range;
|
||
|
extern range f6();
|
||
|
void f7() {
|
||
|
range r = f6();
|
||
|
}
|
||
|
|
||
|
/* Member expressions */
|
||
|
typedef struct {
|
||
|
range range1;
|
||
|
range range2;
|
||
|
} rangepair;
|
||
|
|
||
|
void f8() {
|
||
|
rangepair p;
|
||
|
|
||
|
range r = p.range1;
|
||
|
}
|
||
|
|
||
|
void f9(range *p) {
|
||
|
range r = *p;
|
||
|
}
|
||
|
|
||
|
void f10(range *p) {
|
||
|
range r = p[0];
|
||
|
}
|
||
|
|
||
|
/* _Bool types */
|
||
|
|
||
|
struct _w {
|
||
|
short a,b;
|
||
|
short c,d;
|
||
|
short e,f;
|
||
|
short g;
|
||
|
|
||
|
unsigned int h,i;
|
||
|
|
||
|
_Bool j,k;
|
||
|
} ws;
|
||
|
|
||
|
/* Implicit casts (due to typedefs) */
|
||
|
typedef struct _a {
|
||
|
int a;
|
||
|
} a;
|
||
|
|
||
|
void f11() {
|
||
|
struct _a a1;
|
||
|
a a2;
|
||
|
|
||
|
a1 = a2;
|
||
|
a2 = a1;
|
||
|
}
|
||
|
|
||
|
/* Implicit casts (due to const) */
|
||
|
void f12() {
|
||
|
struct _a a1;
|
||
|
const struct _a a2;
|
||
|
|
||
|
a1 = a2;
|
||
|
}
|
||
|
|
||
|
/* struct initialization */
|
||
|
struct a13 {int b; int c;};
|
||
|
struct a13 c13 = {5};
|
||
|
typedef struct a13 a13;
|
||
|
struct a14 { short a; int b; } x = {1, 1};
|
||
|
|
||
|
/* flexible array members */
|
||
|
struct a15 {char a; int b[];} c15;
|
||
|
int a16(void) {c15.a = 1;}
|
||
|
|
||
|
/* compound literals */
|
||
|
void f13() {
|
||
|
a13 x; x = (a13){1,2};
|
||
|
}
|
||
|
|
||
|
/* va_arg */
|
||
|
int f14(int i, ...) {
|
||
|
__builtin_va_list l;
|
||
|
__builtin_va_start(l,i);
|
||
|
a13 b = __builtin_va_arg(l, a13);
|
||
|
int c = __builtin_va_arg(l, a13).c;
|
||
|
return b.b;
|
||
|
}
|
||
|
|
||
|
/* Attribute packed */
|
||
|
struct __attribute__((packed)) S2839 { double a[19]; signed char b; } s2839[5];
|
||
|
|
||
|
struct __attribute__((packed)) SS { long double a; char b; } SS;
|
||
|
|
||
|
|
||
|
/* As lvalue */
|
||
|
|
||
|
int f15() {
|
||
|
extern range f15_ext();
|
||
|
return f15_ext().location;
|
||
|
}
|
||
|
|
||
|
range f16() {
|
||
|
extern rangepair f16_ext();
|
||
|
return f16_ext().range1;
|
||
|
}
|
||
|
|
||
|
int f17() {
|
||
|
extern range f17_ext();
|
||
|
range r;
|
||
|
return (r = f17_ext()).location;
|
||
|
}
|
||
|
|
||
|
range f18() {
|
||
|
extern rangepair f18_ext();
|
||
|
rangepair rp;
|
||
|
return (rp = f18_ext()).range1;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
// Complex forward reference of struct.
|
||
|
struct f19S;
|
||
|
extern struct f19T {
|
||
|
struct f19S (*p)(void);
|
||
|
} t;
|
||
|
struct f19S { int i; };
|
||
|
void f19(void) {
|
||
|
t.p();
|
||
|
}
|
||
|
|