Home | History | Annotate | Download | only in CodeGen
      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 }
    184 
    185 
    186 
    187 // Complex forward reference of struct.
    188 struct f19S;
    189 extern struct f19T {
    190   struct f19S (*p)(void);
    191 } t;
    192 struct f19S { int i; };
    193 void f19(void) {
    194   t.p();
    195 }
    196 
    197