|  | // 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(); | 
|  | } | 
|  |  |