blob: c9fc461942f8230d666e4265392583044154fbde [file] [log] [blame]
/* { dg-do compile } */
/* { dg-options "-O3 -Warray-bounds=2" } */
typedef __SIZE_TYPE__ size_t;
extern void* malloc(size_t x);
int e[3];
struct f { int f[3]; };
extern void bar(int v[]);
struct h {
int i;
int j[];
};
struct h0 {
int i;
int j[0];
};
struct h0b {
int i;
int j[0];
int k;
};
struct h1 {
int i;
int j[1];
};
struct h1b {
int i;
int j[1];
int k;
};
struct h3 {
int i;
int j[3];
};
struct h3b {
int i;
int j[3];
int k;
};
void foo(int (*a)[3])
{
(*a)[4] = 1; /* { dg-warning "subscript 4 is above array bound" } */
a[0][0] = 1; // ok
a[1][0] = 1; // ok
a[1][4] = 1; /* { dg-warning "subscript 4 is above array bound" } */
int c[3] = { 0 };
c[4] = 1; /* { dg-warning "subscript 4 is above array bound" } */
e[4] = 1; /* { dg-warning "subscript 4 is above array bound" } */
struct f f;
f.f[4] = 1; /* { dg-warning "subscript 4 is above array bound" } */
struct h* h = malloc(sizeof(struct h) + 3 * sizeof(int));
struct h0* h0 = malloc(sizeof(struct h0) + 3 * sizeof(int));
struct h1* h1 = malloc(sizeof(struct h1) + 3 * sizeof(int));
struct h3* h3 = malloc(sizeof(struct h3));
h->j[4] = 1; // flexible array member
h0->j[4] = 1; // zero-sized array extension
h1->j[4] = 1; /* { dg-warning "subscript 4 is above array bound" } */
h3->j[4] = 1; /* { dg-warning "subscript 4 is above array bound" } */
struct h0b* h0b = malloc(sizeof(struct h) + 3 * sizeof(int));
struct h1b* h1b = malloc(sizeof(struct h1b) + 3 * sizeof(int));
struct h3b* h3b = malloc(sizeof(struct h3b));
// h0b->j[4] = 1;
h1b->j[4] = 1;; /* { dg-warning "subscript 4 is above array bound" } */
h3b->j[4] = 1;; /* { dg-warning "subscript 4 is above array bound" } */
// make sure nothing gets optimized away
bar(*a);
bar(c);
bar(e);
bar(f.f);
bar(h1->j);
bar(h3->j);
bar(h3b->j);
bar(h1b->j);
bar(h->j);
bar(h0->j);
}