view gcc/testsuite/gcc.dg/builtin-object-size-6.c @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children
line wrap: on
line source

/* { dg-do run } */
/* { dg-options "-O2" } */

typedef __SIZE_TYPE__ size_t;
extern void abort (void);
extern void exit (int);
extern void *malloc (size_t);
extern void free (void *);

struct A
{
  char a[10];
  int b;
  char c[10];
};

void
__attribute__ ((noinline))
test1 (struct A *p)
{
  char *c;
  if (__builtin_object_size (&p->a, 0) != (size_t) -1)
    abort ();
  if (__builtin_object_size (&p->a[0], 0) != (size_t) -1)
    abort ();
  if (__builtin_object_size (&p->a[3], 0) != (size_t) -1)
    abort ();
  if (__builtin_object_size (&p->b, 0) != (size_t) -1)
    abort ();
  if (__builtin_object_size (&p->c, 0) != (size_t) -1)
    abort ();
  c = p->a;
  if (__builtin_object_size (c, 0) != (size_t) -1)
    abort ();
  c = &p->a[0];
  if (__builtin_object_size (c, 0) != (size_t) -1)
    abort ();
  c = &p->a[3];
  if (__builtin_object_size (c, 0) != (size_t) -1)
    abort ();
  c = (char *) &p->b;
  if (__builtin_object_size (c, 0) != (size_t) -1)
    abort ();
  c = (char *) &p->c;
  if (__builtin_object_size (c, 0) != (size_t) -1)
    abort ();
  if (__builtin_object_size (&p->a, 1) != sizeof (p->a))
    abort ();
  if (__builtin_object_size (&p->a[0], 1) != sizeof (p->a))
    abort ();
  if (__builtin_object_size (&p->a[3], 1) != sizeof (p->a) - 3)
    abort ();
  if (__builtin_object_size (&p->b, 1) != sizeof (p->b))
    abort ();
  if (__builtin_object_size (&p->c, 1) != (size_t) -1)
    abort ();
  c = p->a;
  if (__builtin_object_size (c, 1) != sizeof (p->a))
    abort ();
  c = &p->a[0];
  if (__builtin_object_size (c, 1) != sizeof (p->a))
    abort ();
  c = &p->a[3];
  if (__builtin_object_size (c, 1) != sizeof (p->a) - 3)
    abort ();
  c = (char *) &p->b;
  if (__builtin_object_size (c, 1) != sizeof (p->b))
    abort ();
  c = (char *) &p->c;
  if (__builtin_object_size (c, 1) != (size_t) -1)
    abort ();
  if (__builtin_object_size (&p->a, 2) != 0)
    abort ();
  if (__builtin_object_size (&p->a[0], 2) != 0)
    abort ();
  if (__builtin_object_size (&p->a[3], 2) != 0)
    abort ();
  if (__builtin_object_size (&p->b, 2) != 0)
    abort ();
  if (__builtin_object_size (&p->c, 2) != 0)
    abort ();
  c = p->a;
  if (__builtin_object_size (c, 2) != 0)
    abort ();
  c = &p->a[0];
  if (__builtin_object_size (c, 2) != 0)
    abort ();
  c = &p->a[3];
  if (__builtin_object_size (c, 2) != 0)
    abort ();
  c = (char *) &p->b;
  if (__builtin_object_size (c, 2) != 0)
    abort ();
  c = (char *) &p->c;
  if (__builtin_object_size (c, 2) != 0)
    abort ();
  if (__builtin_object_size (&p->a, 3) != sizeof (p->a))
    abort ();
  if (__builtin_object_size (&p->a[0], 3) != sizeof (p->a))
    abort ();
  if (__builtin_object_size (&p->a[3], 3) != sizeof (p->a) - 3)
    abort ();
  if (__builtin_object_size (&p->b, 3) != sizeof (p->b))
    abort ();
  if (__builtin_object_size (&p->c, 3) != 0)
    abort ();
  c = p->a;
  if (__builtin_object_size (c, 3) != sizeof (p->a))
    abort ();
  c = &p->a[0];
  if (__builtin_object_size (c, 3) != sizeof (p->a))
    abort ();
  c = &p->a[3];
  if (__builtin_object_size (c, 3) != sizeof (p->a) - 3)
    abort ();
  c = (char *) &p->b;
  if (__builtin_object_size (c, 3) != sizeof (p->b))
    abort ();
  c = (char *) &p->c;
  if (__builtin_object_size (c, 3) != 0)
    abort ();
}

void
__attribute__ ((noinline))
test2 (void)
{
  char *c;
  size_t s = 2 * sizeof (struct A);
  struct A *p = malloc (2 * sizeof (struct A));
  if (__builtin_object_size (&p->a, 0) != s)
    abort ();
  if (__builtin_object_size (&p->a[0], 0) != s)
    abort ();
  if (__builtin_object_size (&p->a[3], 0) != s - 3)
    abort ();
  if (__builtin_object_size (&p->b, 0) != s - __builtin_offsetof (struct A, b))
    abort ();
  if (__builtin_object_size (&p->c, 0) != s - __builtin_offsetof (struct A, c))
    abort ();
  c = p->a;
  if (__builtin_object_size (c, 0) != s)
    abort ();
  c = &p->a[0];
  if (__builtin_object_size (c, 0) != s)
    abort ();
  c = &p->a[3];
  if (__builtin_object_size (c, 0) != s - 3)
    abort ();
  c = (char *) &p->b;
  if (__builtin_object_size (c, 0) != s - __builtin_offsetof (struct A, b))
    abort ();
  c = (char *) &p->c;
  if (__builtin_object_size (c, 0) != s - __builtin_offsetof (struct A, c))
    abort ();
  if (__builtin_object_size (&p->a, 1) != sizeof (p->a))
    abort ();
  if (__builtin_object_size (&p->a[0], 1) != sizeof (p->a))
    abort ();
  if (__builtin_object_size (&p->a[3], 1) != sizeof (p->a) - 3)
    abort ();
  if (__builtin_object_size (&p->b, 1) != sizeof (p->b))
    abort ();
  if (__builtin_object_size (&p->c, 1) != s - __builtin_offsetof (struct A, c))
    abort ();
  c = p->a;
  if (__builtin_object_size (c, 1) != sizeof (p->a))
    abort ();
  c = &p->a[0];
  if (__builtin_object_size (c, 1) != sizeof (p->a))
    abort ();
  c = &p->a[3];
  if (__builtin_object_size (c, 1) != sizeof (p->a) - 3)
    abort ();
  c = (char *) &p->b;
  if (__builtin_object_size (c, 1) != sizeof (p->b))
    abort ();
  c = (char *) &p->c;
  if (__builtin_object_size (c, 1) != s - __builtin_offsetof (struct A, c))
    abort ();
  if (__builtin_object_size (&p->a, 2) != s)
    abort ();
  if (__builtin_object_size (&p->a[0], 2) != s)
    abort ();
  if (__builtin_object_size (&p->a[3], 2) != s - 3)
    abort ();
  if (__builtin_object_size (&p->b, 2) != s - __builtin_offsetof (struct A, b))
    abort ();
  if (__builtin_object_size (&p->c, 2) != s - __builtin_offsetof (struct A, c))
    abort ();
  c = p->a;
  if (__builtin_object_size (c, 2) != s)
    abort ();
  c = &p->a[0];
  if (__builtin_object_size (c, 2) != s)
    abort ();
  c = &p->a[3];
  if (__builtin_object_size (c, 2) != s - 3)
    abort ();
  c = (char *) &p->b;
  if (__builtin_object_size (c, 2) != s - __builtin_offsetof (struct A, b))
    abort ();
  c = (char *) &p->c;
  if (__builtin_object_size (c, 2) != s - __builtin_offsetof (struct A, c))
    abort ();
  if (__builtin_object_size (&p->a, 3) != sizeof (p->a))
    abort ();
  if (__builtin_object_size (&p->a[0], 3) != sizeof (p->a))
    abort ();
  if (__builtin_object_size (&p->a[3], 3) != sizeof (p->a) - 3)
    abort ();
  if (__builtin_object_size (&p->b, 3) != sizeof (p->b))
    abort ();
  if (__builtin_object_size (&p->c, 3) != s - __builtin_offsetof (struct A, c))
    abort ();
  c = p->a;
  if (__builtin_object_size (c, 3) != sizeof (p->a))
    abort ();
  c = &p->a[0];
  if (__builtin_object_size (c, 3) != sizeof (p->a))
    abort ();
  c = &p->a[3];
  if (__builtin_object_size (c, 3) != sizeof (p->a) - 3)
    abort ();
  c = (char *) &p->b;
  if (__builtin_object_size (c, 3) != sizeof (p->b))
    abort ();
  c = (char *) &p->c;
  if (__builtin_object_size (c, 3) != s - __builtin_offsetof (struct A, c))
    abort ();
  free (p);
}

void
__attribute__ ((noinline))
test3 (void)
{
  char *c;
  size_t s;
  struct A *p = malloc (4);
  if (__builtin_object_size (&p->a, 0) != 4)
    abort ();
  if (__builtin_object_size (&p->a[0], 0) != 4)
    abort ();
  if (__builtin_object_size (&p->a[3], 0) != 1)
    abort ();
  if (__builtin_object_size (&p->b, 0) != 0)
    abort ();
  if (__builtin_object_size (&p->c, 0) != 0)
    abort ();
  if (__builtin_object_size (&p->a, 1) != 4)
    abort ();
  if (__builtin_object_size (&p->a[0], 1) != 4)
    abort ();
  if (__builtin_object_size (&p->a[3], 1) != 1)
    abort ();
  if (__builtin_object_size (&p->b, 1) != 0)
    abort ();
  if (__builtin_object_size (&p->c, 1) != 0)
    abort ();
  free (p);
  s = __builtin_offsetof (struct A, c) + 4;
  p = malloc (s);
  if (__builtin_object_size (&p->a, 0) != s)
    abort ();
  if (__builtin_object_size (&p->a[0], 0) != s)
    abort ();
  if (__builtin_object_size (&p->a[3], 0) != s - 3)
    abort ();
  if (__builtin_object_size (&p->b, 0) != s - __builtin_offsetof (struct A, b))
    abort ();
  if (__builtin_object_size (&p->c, 0) != 4)
    abort ();
  if (__builtin_object_size (&p->a, 1) != sizeof (p->a))
    abort ();
  if (__builtin_object_size (&p->a[0], 1) != sizeof (p->a))
    abort ();
  if (__builtin_object_size (&p->a[3], 1) != sizeof (p->a) - 3)
    abort ();
  if (__builtin_object_size (&p->b, 1) != sizeof (p->b))
    abort ();
  if (__builtin_object_size (&p->c, 1) != 4)
    abort ();
  free (p);
}

struct B
{
  struct A a[4];
};

void
__attribute__ ((noinline))
test4 (struct B *q, int i)
{
  if (__builtin_object_size (&q->a[2].a[2], 1) != sizeof (q->a[0].a) - 2)
    abort ();
  if (__builtin_object_size (&q->a[2].c[2], 1) != sizeof (q->a[0].c) - 2)
    abort ();
  if (__builtin_object_size (&q->a[3].a[2], 1) != sizeof (q->a[0].a) - 2)
    abort ();
  if (__builtin_object_size (&q->a[3].c[2], 1) != sizeof (q->a[0].c) - 2)
    abort ();
  if (__builtin_object_size (&q->a[i].a[2], 1) != sizeof (q->a[0].a) - 2)
    abort ();
  if (__builtin_object_size (&q->a[i].c[2], 1) != sizeof (q->a[0].c) - 2)
    abort ();
}

struct C
{
  char a[10];
  char b;
};

void
__attribute__ ((noinline))
test5 (struct C *c)
{
  if (__builtin_object_size (&c->b, 0) != (size_t) -1)
    abort ();
  if (__builtin_object_size (&c->b, 1) != 1)
    abort ();
  if (__builtin_object_size (&c->b, 2) != 0)
    abort ();
  if (__builtin_object_size (&c->b, 3) != 1)
    abort ();
}

struct D
{
  int i;
  struct D1
  {
    char b;
    char a[10];
  } j;
};

void
__attribute__ ((noinline))
test6 (struct D *d)
{
  if (__builtin_object_size (&d->j.a[3], 0) != (size_t) -1)
    abort ();
  if (__builtin_object_size (&d->j.a[3], 1) != sizeof (d->j.a) - 3)
    abort ();
  if (__builtin_object_size (&d->j.a[3], 2) != 0)
    abort ();
  if (__builtin_object_size (&d->j.a[3], 3) != sizeof (d->j.a) - 3)
    abort ();
}

struct E
{
  int i;
  struct E1
  {
    char b;
    char a[10];
  } j[1];
};

void
__attribute__ ((noinline))
test7 (struct E *e)
{
  if (__builtin_object_size (&e->j[0].a[3], 0) != (size_t) -1)
    abort ();
  if (__builtin_object_size (&e->j[0].a[3], 1) != sizeof (e->j[0].a) - 3)
    abort ();
  if (__builtin_object_size (&e->j[0].a[3], 2) != 0)
    abort ();
  if (__builtin_object_size (&e->j[0].a[3], 3) != sizeof (e->j[0].a) - 3)
    abort ();
  if (__builtin_object_size ((char *) &e->j[0], 0) != (size_t) -1)
    abort ();
  if (__builtin_object_size ((char *) &e->j[0], 1) != (size_t) -1)
    abort ();
  if (__builtin_object_size ((char *) &e->j[0], 2) != 0)
    abort ();
  if (__builtin_object_size ((char *) &e->j[0], 3) != 0)
    abort ();
}

union F
{
  char a[1];
  struct F1
  {
    char b;
    char c[10];
  } d;
};

void
__attribute__ ((noinline))
test8 (union F *f)
{
  if (__builtin_object_size (&f->d.c[3], 0) != (size_t) -1)
    abort ();
  if (__builtin_object_size (&f->d.c[3], 1) != (size_t) -1)
    abort ();
  if (__builtin_object_size (&f->d.c[3], 2) != 0)
    abort ();
  if (__builtin_object_size (&f->d.c[3], 3) != 0)
    abort ();
}

int
main (void)
{
  struct A a, *p = &a;
  int i = 1;
  __asm ("" : "+r" (p));
  test1 (p);
  test2 ();
  test3 ();
  struct B b, *q = &b;
  __asm ("" : "+r" (q), "+r" (i));
  test4 (q, i);
  struct C c, *cp = &c;
  __asm ("" : "+r" (cp));
  test5 (cp);
  struct D d, *dp = &d;
  __asm ("" : "+r" (dp));
  test6 (dp);
  struct E e, *ep = &e;
  __asm ("" : "+r" (ep));
  test7 (ep);
  union F f, *fp = &f;
  __asm ("" : "+r" (fp));
  test8 (fp);
  exit (0);
}