/* { dg-require-holes-deterministic "" } */
#include "harness.h"
#include <stdarg.h>
#include <stddef.h>
#include <string.h>

typedef struct n_a
{
  signed char m1;
  short m2;
  int m3;
  double m4;
  vector float m5;
}
n_a;

static n_a gn_a;

static int
lay(char *p, int start, int end, int n)
{
  int b;
  unsigned char ch;
  unsigned int mask;

  start *= 8;
  end *= 8;
  n *= 8;

  for (b = 0; b + 8 <= start; b += 8)
    {
      ch = *p++;
      if (ch != 0xff)
	for (mask = 0x80; mask; b++, mask >>= 1)
	  if ((ch & mask) != mask)
	    return b;
    }

  if (b < start)
    {
      ch = *p++;
      for (mask = 0x80; b < start; b++, mask >>= 1)
	if ((ch & mask) != mask)
	  return b;
      for (; mask && b < end; b++, mask >>= 1)
	if ((ch & mask) != 0)
	  return b;
    }

  for (; b + 8 <= end; b += 8)
    {
      ch = *p++;
      if (ch != 0)
	for (mask = 0x80; mask; b++, mask >>= 1)
	  if ((ch & mask) != 0)
	    return b;
    }

  if (b < end)
    {
      ch = *p++;
      for (mask = 0x80; b < end; b++, mask >>= 1)
	if ((ch & mask) != 0)
	  return b;
      for (; mask && b < n; b++, mask >>= 1)
	if ((ch & mask) != mask)
	  return b;
    }

  for (; b + 8 <= n; b += 8)
    {
      ch = *p++;
      if (ch != 0xff)
	for (mask = 0x80; mask; b++, mask >>= 1)
	  if ((ch & mask) != mask)
	    return b;
    }

  return n;
}

static void
initn_a(signed char p1, short p2, int p3, double p4, vector float p5)
{
  n_a i;

  i.m1 = p1;
  i.m2 = p2;
  i.m3 = p3;
  i.m4 = p4;
  i.m5 = p5;

  check(i.m1 == 77, "i.m1");
  check(i.m2 == 1924, "i.m2");
  check(i.m3 == -1471601920, "i.m3");
  check(vec_all_eq(i.m5, ((vector float){-1.38e+09, 5.96e+08, 6.88e+08, -3.2e+08})),
	"i.m5");

  check(sizeof(n_a) == 32, "sizeof(n_a)");

  check(offsetof(n_a, m1) == 0,  "offsetof(m1)");
  check(offsetof(n_a, m2) == 2,  "offsetof(m2)");
  check(offsetof(n_a, m3) == 4,  "offsetof(m3)");
  check(offsetof(n_a, m4) == 8,  "offsetof(m4)");
  check(offsetof(n_a, m5) == 16, "offsetof(m5)");

  check(sizeof(i.m1) == 1,  "sizeof(m1)");
  check(sizeof(i.m2) == 2,  "sizeof(m2)");
  check(sizeof(i.m3) == 4,  "sizeof(m3)");
  check(sizeof(i.m4) == 8,  "sizeof(m4)");
  check(sizeof(i.m5) == 16, "sizeof(m5)");

#define lay_check(field) do {				\
  memset((char *)&i, 0xFF, sizeof(i));			\
  lay_reset(field);					\
  check(lay((char *)&i,					\
	    offsetof(n_a, field),			\
	    offsetof(n_a, field) + sizeof(i.field),	\
	    sizeof(i)) == sizeof(i)*8,			\
	"lay(" #field ")");				\
  } while (0)
#define lay_reset(field) i.field = 0

  lay_check(m1);
  lay_check(m2);
  lay_check(m3);
  lay_check(m4);
#undef lay_reset
#define lay_reset(field) i.field = ((vector float){0,0,0,0})
  lay_check(m5);

#undef lay_check
#undef lay_reset
}

n_a
valuen_a(void)
{
  return gn_a;
}

n_a *
addrn_a(void)
{
  return &gn_a;
}

static void
eqn_a(n_a * a)
{
  check(a->m1 == 77, "a->m1");
  check(a->m2 == 1924, "a->m2");
  check(a->m3 == -1471601920, "a->m3");
  check(vec_all_eq(a->m5, ((vector float){-1.38e+09, 5.96e+08, 6.88e+08, -3.2e+08})),
	"a->m5");
}

static void
getsn_a(n_a * a)
{
  a->m1 = 77;
  a->m2 = 1924;
  a->m3 = -1471601920;
  a->m4 = 3.65e+18;
  a->m5 = ((vector float){-1.38e+09, 5.96e+08, 6.88e+08, -3.2e+08});
}

static void
varlistn_a(signed char p1, va_list ap)
{
  n_a q;
  q.m1 = p1;
  q.m2 = va_arg(ap, int);
  q.m3 = va_arg(ap, int);
  q.m4 = va_arg(ap, double);
  q.m5 = va_arg(ap, vector float);

  check(q.m1 == 77, "q.m1");
  check(q.m2 == 1924, "q.m2");
  check(q.m3 == -1471601920, "q.m3");
  check(vec_all_eq(q.m5, ((vector float){-1.38e+09, 5.96e+08, 6.88e+08, -3.2e+08})),
	"q.m5");
}

static void
varargsn_a(signed char p1, ...)
{
  n_a q, r;
  va_list ap;

  va_start(ap, p1);
  q.m1 = p1;
  q.m2 = va_arg(ap, int);
  q.m3 = va_arg(ap, int);
  q.m4 = va_arg(ap, double);
  q.m5 = va_arg(ap, vector float);
  va_end(ap);

  check(q.m1 == 77, "q.m1");
  check(q.m2 == 1924, "q.m2");
  check(q.m3 == -1471601920, "q.m3");
  check(vec_all_eq(q.m5, ((vector float){-1.38e+09, 5.96e+08, 6.88e+08, -3.2e+08})),
	"q.m5");

  va_start(ap, p1);
  r.m1 = p1;
  r.m2 = va_arg(ap, int);
  r.m3 = va_arg(ap, int);
  r.m4 = va_arg(ap, double);
  r.m5 = va_arg(ap, vector float);
  va_end(ap);

  check(r.m1 == 77, "r.m1");
  check(r.m2 == 1924, "r.m2");
  check(r.m3 == -1471601920, "r.m3");
  check(vec_all_eq(r.m5, ((vector float){-1.38e+09, 5.96e+08, 6.88e+08, -3.2e+08})),
	"r.m5");

  va_start(ap, p1);
  varlistn_a(p1, ap);
  va_end(ap);
}

static void
test()
{
  static struct
  {
    char a;
    n_a b;
  }
  s;
  n_a v[3], a, *p;

  static n_a i = { 77, 1924, -1471601920, 3.65e+18, {-1.38e+09, 5.96e+08, 6.88e+08, -3.2e+08} };

  memset((char *)&(v), -1, sizeof(v));
  v[1] = s.b;
  check(lay((char *)&v, sizeof(n_a), sizeof(n_a)*2, sizeof(n_a)*3) == sizeof(n_a)*3*8,
	"structure assignment");

  check(i.m1 == 77, "i.m1");
  check(i.m2 == 1924, "i.m2");
  check(i.m3 == -1471601920, "i.m3");
  check(vec_all_eq(i.m5, ((vector float){-1.38e+09, 5.96e+08, 6.88e+08, -3.2e+08})),
	"i.m5");

  initn_a(77, 1924, -1471601920, 3.65e+18, ((vector float){-1.38e+09, 5.96e+08, 6.88e+08, -3.2e+08}));
  varargsn_a(77, 1924, -1471601920, 3.65e+18, ((vector float){-1.38e+09, 5.96e+08, 6.88e+08, -3.2e+08}));

  gn_a.m1 = 77;
  gn_a.m2 = 1924;
  gn_a.m3 = -1471601920;
  gn_a.m4 = 3.65e+18;
  gn_a.m5 = ((vector float){-1.38e+09, 5.96e+08, 6.88e+08, -3.2e+08});
  a = valuen_a();

  check(a.m1 == 77, "a.m1");
  check(a.m2 == 1924, "a.m2");
  check(a.m3 == -1471601920, "a.m3");
  check(vec_all_eq(a.m5, ((vector float){-1.38e+09, 5.96e+08, 6.88e+08, -3.2e+08})),
	"a.m5");

  p = addrn_a();

  check(p->m1 == 77, "p->m1");
  check(p->m2 == 1924, "p->m2");
  check(p->m3 == -1471601920, "p->m3");
  check(vec_all_eq(p->m5, ((vector float){-1.38e+09, 5.96e+08, 6.88e+08, -3.2e+08})),
	"p->m5");

  eqn_a(&a);

  check(gn_a.m1 == 77, "gn_a.m1");
  check(gn_a.m2 == 1924, "gn_a.m2");
  check(gn_a.m3 == -1471601920, "gn_a.m3");
  check(vec_all_eq(gn_a.m5, ((vector float){-1.38e+09, 5.96e+08, 6.88e+08, -3.2e+08})),
	"gn_a.m5");

  getsn_a(&v[0]);
  v[2].m1 = v[0].m1;
  v[2].m2 = v[0].m2;
  v[2].m3 = v[0].m3;
  v[2].m4 = v[0].m4;
  v[2].m5 = v[0].m5;

  check(v[2].m1 == 77, "v[2].m1");
  check(v[2].m2 == 1924, "v[2].m2");
  check(v[2].m3 == -1471601920, "v[2].m3");
  check(vec_all_eq(v[2].m5, ((vector float){-1.38e+09, 5.96e+08, 6.88e+08, -3.2e+08})),
	"v[2].m5");
}
