| // RUN: clang %s -emit-llvm -o %t |
| |
| 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); |
| 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; |
| } |