// RUN: clang -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);
  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;
}
