436 lines
11 KiB
C
436 lines
11 KiB
C
/* { 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);
|
|
}
|