Daniel Dunbar | d7d5f02 | 2009-03-24 02:24:46 +0000 | [diff] [blame] | 1 | // RUN: clang-cc -triple i386-unknown-unknown %s -emit-llvm -o - |
Devang Patel | b9b00ad | 2007-10-23 20:28:39 +0000 | [diff] [blame] | 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 | } |
Devang Patel | b1e3989 | 2007-10-23 23:26:46 +0000 | [diff] [blame] | 40 | |
| 41 | /* Nested structs */ |
| 42 | typedef struct NA { |
| 43 | int data; |
| 44 | struct NA *next; |
| 45 | } NA; |
Devang Patel | dbb46b1 | 2007-10-23 23:29:51 +0000 | [diff] [blame] | 46 | void f1() { NA a; } |
Devang Patel | b1e3989 | 2007-10-23 23:26:46 +0000 | [diff] [blame] | 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 | |
Devang Patel | 126a856 | 2007-10-24 22:26:28 +0000 | [diff] [blame] | 58 | extern NB *f3(); |
| 59 | void f4() { |
| 60 | f3()->d1 = 42; |
| 61 | } |
Devang Patel | 0a96118 | 2007-10-26 18:15:21 +0000 | [diff] [blame] | 62 | |
| 63 | void f5() { |
| 64 | (f3())->d1 = 42; |
| 65 | } |
Anders Carlsson | 148fe67 | 2007-10-31 22:04:46 +0000 | [diff] [blame] | 66 | |
| 67 | /* Function calls */ |
| 68 | typedef struct { |
| 69 | int location; |
| 70 | int length; |
| 71 | } range; |
Anders Carlsson | 148fe67 | 2007-10-31 22:04:46 +0000 | [diff] [blame] | 72 | extern range f6(); |
| 73 | void f7() |
| 74 | { |
Anders Carlsson | a1ff3e9 | 2007-11-02 16:59:10 +0000 | [diff] [blame] | 75 | range r = f6(); |
| 76 | } |
| 77 | |
| 78 | /* Member expressions */ |
| 79 | typedef struct { |
| 80 | range range1; |
| 81 | range range2; |
| 82 | } rangepair; |
| 83 | |
| 84 | void f8() |
| 85 | { |
| 86 | rangepair p; |
| 87 | |
| 88 | range r = p.range1; |
Anders Carlsson | 148fe67 | 2007-10-31 22:04:46 +0000 | [diff] [blame] | 89 | } |
| 90 | |
Seo Sanghyeon | 7777bb2 | 2007-12-14 01:09:11 +0000 | [diff] [blame] | 91 | void f9(range *p) |
| 92 | { |
| 93 | range r = *p; |
| 94 | } |
Anders Carlsson | 148fe67 | 2007-10-31 22:04:46 +0000 | [diff] [blame] | 95 | |
Seo Sanghyeon | 9b73b39 | 2007-12-14 02:04:12 +0000 | [diff] [blame] | 96 | void f10(range *p) |
| 97 | { |
| 98 | range r = p[0]; |
| 99 | } |
| 100 | |
Devang Patel | 14c7500 | 2007-12-10 18:25:34 +0000 | [diff] [blame] | 101 | /* _Bool types */ |
| 102 | |
| 103 | struct _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 Carlsson | e4707ff | 2008-01-14 06:28:57 +0000 | [diff] [blame] | 114 | |
| 115 | /* Implicit casts (due to typedefs) */ |
| 116 | typedef struct _a |
| 117 | { |
| 118 | int a; |
| 119 | } a; |
| 120 | |
| 121 | void f11() |
| 122 | { |
| 123 | struct _a a1; |
| 124 | a a2; |
| 125 | |
| 126 | a1 = a2; |
| 127 | a2 = a1; |
| 128 | } |
Anders Carlsson | a46b759 | 2008-01-18 02:25:57 +0000 | [diff] [blame] | 129 | |
| 130 | /* Implicit casts (due to const) */ |
| 131 | void f12() |
| 132 | { |
| 133 | struct _a a1; |
| 134 | const struct _a a2; |
| 135 | |
| 136 | a1 = a2; |
Devang Patel | 47fb697 | 2008-01-29 23:23:18 +0000 | [diff] [blame] | 137 | } |
| 138 | |
| 139 | /* struct initialization */ |
Eli Friedman | 75afb58 | 2008-02-06 05:33:51 +0000 | [diff] [blame] | 140 | struct a13 {int b; int c;}; |
Devang Patel | 47fb697 | 2008-01-29 23:23:18 +0000 | [diff] [blame] | 141 | struct a13 c13 = {5}; |
Devang Patel | bf20b68 | 2008-05-27 22:44:22 +0000 | [diff] [blame] | 142 | typedef struct a13 a13; |
Devang Patel | eae1560 | 2008-02-05 02:39:50 +0000 | [diff] [blame] | 143 | struct a14 { short a; int b; } x = {1, 1}; |
Eli Friedman | 75afb58 | 2008-02-06 05:33:51 +0000 | [diff] [blame] | 144 | |
| 145 | /* flexible array members */ |
| 146 | struct a15 {char a; int b[];} c15; |
| 147 | int a16(void) {c15.a = 1;} |
Eli Friedman | b185124 | 2008-05-27 15:51:49 +0000 | [diff] [blame] | 148 | |
| 149 | /* compound literals */ |
| 150 | void f13() |
| 151 | { |
| 152 | a13 x; x = (a13){1,2}; |
| 153 | } |
| 154 | |
| 155 | /* va_arg */ |
| 156 | int f14(int i, ...) { |
| 157 | __builtin_va_list l; |
| 158 | __builtin_va_start(l,i); |
| 159 | a13 b = __builtin_va_arg(l, a13); |
Daniel Dunbar | 4dc346e | 2009-02-12 08:41:10 +0000 | [diff] [blame] | 160 | int c = __builtin_va_arg(l, a13).c; |
Eli Friedman | b185124 | 2008-05-27 15:51:49 +0000 | [diff] [blame] | 161 | return b.b; |
| 162 | } |
Devang Patel | 2fb86e6 | 2008-05-27 22:45:40 +0000 | [diff] [blame] | 163 | |
| 164 | /* Attribute packed */ |
| 165 | struct __attribute__((packed)) S2839 { double a[19]; signed char b; } s2839[5]; |
Eli Friedman | 0408f68 | 2008-05-29 10:58:49 +0000 | [diff] [blame] | 166 | |
| 167 | struct __attribute__((packed)) SS { long double a; char b; } SS; |
| 168 | |
Daniel Dunbar | 80e62c2 | 2008-09-04 03:20:13 +0000 | [diff] [blame] | 169 | |
| 170 | /* As lvalue */ |
| 171 | |
| 172 | int f15() { |
| 173 | extern range f15_ext(); |
| 174 | return f15_ext().location; |
| 175 | } |
| 176 | |
| 177 | range f16() { |
| 178 | extern rangepair f16_ext(); |
| 179 | return f16_ext().range1; |
| 180 | } |
| 181 | |
| 182 | int f17() { |
| 183 | extern range f17_ext(); |
| 184 | range r; |
| 185 | return (r = f17_ext()).location; |
| 186 | } |
| 187 | |
| 188 | range f18() { |
| 189 | extern rangepair f18_ext(); |
| 190 | rangepair rp; |
| 191 | return (rp = f18_ext()).range1; |
| 192 | } |