Shih-wei Liao | f8fd82b | 2010-02-10 11:10:31 -0800 | [diff] [blame^] | 1 | // RUN: %clang_cc1 -triple i386-unknown-unknown %s -emit-llvm -o - |
| 2 | |
| 3 | struct { |
| 4 | int x; |
| 5 | int y; |
| 6 | } point; |
| 7 | |
| 8 | void fn1() { |
| 9 | point.x = 42; |
| 10 | } |
| 11 | |
| 12 | /* Nested member */ |
| 13 | struct { |
| 14 | struct { |
| 15 | int a; |
| 16 | int b; |
| 17 | } p1; |
| 18 | } point2; |
| 19 | |
| 20 | void fn2() { |
| 21 | point2.p1.a = 42; |
| 22 | } |
| 23 | |
| 24 | /* Indirect reference */ |
| 25 | typedef struct __sf { |
| 26 | unsigned char *c; |
| 27 | short flags; |
| 28 | } F; |
| 29 | |
| 30 | typedef struct __sf2 { |
| 31 | F *ff; |
| 32 | } F2; |
| 33 | |
| 34 | int fn3(F2 *c) { |
| 35 | if (c->ff->c >= 0) |
| 36 | return 1; |
| 37 | else |
| 38 | return 0; |
| 39 | } |
| 40 | |
| 41 | /* Nested structs */ |
| 42 | typedef struct NA { |
| 43 | int data; |
| 44 | struct NA *next; |
| 45 | } NA; |
| 46 | void f1() { NA a; } |
| 47 | |
| 48 | typedef struct NB { |
| 49 | int d1; |
| 50 | struct _B2 { |
| 51 | int d2; |
| 52 | struct NB *n2; |
| 53 | } B2; |
| 54 | } NB; |
| 55 | |
| 56 | void f2() { NB b; } |
| 57 | |
| 58 | extern NB *f3(); |
| 59 | void f4() { |
| 60 | f3()->d1 = 42; |
| 61 | } |
| 62 | |
| 63 | void f5() { |
| 64 | (f3())->d1 = 42; |
| 65 | } |
| 66 | |
| 67 | /* Function calls */ |
| 68 | typedef struct { |
| 69 | int location; |
| 70 | int length; |
| 71 | } range; |
| 72 | extern range f6(); |
| 73 | void f7() { |
| 74 | range r = f6(); |
| 75 | } |
| 76 | |
| 77 | /* Member expressions */ |
| 78 | typedef struct { |
| 79 | range range1; |
| 80 | range range2; |
| 81 | } rangepair; |
| 82 | |
| 83 | void f8() { |
| 84 | rangepair p; |
| 85 | |
| 86 | range r = p.range1; |
| 87 | } |
| 88 | |
| 89 | void f9(range *p) { |
| 90 | range r = *p; |
| 91 | } |
| 92 | |
| 93 | void f10(range *p) { |
| 94 | range r = p[0]; |
| 95 | } |
| 96 | |
| 97 | /* _Bool types */ |
| 98 | |
| 99 | struct _w { |
| 100 | short a,b; |
| 101 | short c,d; |
| 102 | short e,f; |
| 103 | short g; |
| 104 | |
| 105 | unsigned int h,i; |
| 106 | |
| 107 | _Bool j,k; |
| 108 | } ws; |
| 109 | |
| 110 | /* Implicit casts (due to typedefs) */ |
| 111 | typedef struct _a { |
| 112 | int a; |
| 113 | } a; |
| 114 | |
| 115 | void f11() { |
| 116 | struct _a a1; |
| 117 | a a2; |
| 118 | |
| 119 | a1 = a2; |
| 120 | a2 = a1; |
| 121 | } |
| 122 | |
| 123 | /* Implicit casts (due to const) */ |
| 124 | void f12() { |
| 125 | struct _a a1; |
| 126 | const struct _a a2; |
| 127 | |
| 128 | a1 = a2; |
| 129 | } |
| 130 | |
| 131 | /* struct initialization */ |
| 132 | struct a13 {int b; int c;}; |
| 133 | struct a13 c13 = {5}; |
| 134 | typedef struct a13 a13; |
| 135 | struct a14 { short a; int b; } x = {1, 1}; |
| 136 | |
| 137 | /* flexible array members */ |
| 138 | struct a15 {char a; int b[];} c15; |
| 139 | int a16(void) {c15.a = 1;} |
| 140 | |
| 141 | /* compound literals */ |
| 142 | void f13() { |
| 143 | a13 x; x = (a13){1,2}; |
| 144 | } |
| 145 | |
| 146 | /* va_arg */ |
| 147 | int f14(int i, ...) { |
| 148 | __builtin_va_list l; |
| 149 | __builtin_va_start(l,i); |
| 150 | a13 b = __builtin_va_arg(l, a13); |
| 151 | int c = __builtin_va_arg(l, a13).c; |
| 152 | return b.b; |
| 153 | } |
| 154 | |
| 155 | /* Attribute packed */ |
| 156 | struct __attribute__((packed)) S2839 { double a[19]; signed char b; } s2839[5]; |
| 157 | |
| 158 | struct __attribute__((packed)) SS { long double a; char b; } SS; |
| 159 | |
| 160 | |
| 161 | /* As lvalue */ |
| 162 | |
| 163 | int f15() { |
| 164 | extern range f15_ext(); |
| 165 | return f15_ext().location; |
| 166 | } |
| 167 | |
| 168 | range f16() { |
| 169 | extern rangepair f16_ext(); |
| 170 | return f16_ext().range1; |
| 171 | } |
| 172 | |
| 173 | int f17() { |
| 174 | extern range f17_ext(); |
| 175 | range r; |
| 176 | return (r = f17_ext()).location; |
| 177 | } |
| 178 | |
| 179 | range f18() { |
| 180 | extern rangepair f18_ext(); |
| 181 | rangepair rp; |
| 182 | return (rp = f18_ext()).range1; |
| 183 | } |