blob: 37ee1912187717ce3e1440cef4bf200b6af29949 [file] [log] [blame]
/* { dg-do compile } */
/* { dg-require-effective-target alloca } */
/* { dg-options "-Walloca-larger-than=2000 -O2 -ftrack-macro-expansion=0" } */
#define alloca __builtin_alloca
typedef __SIZE_TYPE__ size_t;
extern size_t strlen(const char *);
extern void useit (char *);
int num;
void foo1 (size_t len, size_t len2, size_t len3)
{
int i;
for (i=0; i < 123; ++i)
{
char *s = alloca (566); /* { dg-warning "'alloca' within a loop" } */
useit (s);
}
char *s = alloca (123);
useit (s); // OK, constant argument to alloca
s = alloca (num); // { dg-warning "\(may be too large|unbounded use\)" }
useit (s);
s = alloca (30000); /* { dg-warning "is too large" } */
useit (s);
if (len < 2000)
{
s = alloca(len); // OK, bounded
useit (s);
}
if (len + len2 < 2000) // OK, bounded
{
s = alloca(len + len2);
useit (s);
}
if (len3 <= 2001)
{
s = alloca(len3); /* { dg-warning "may be too large" } */
useit(s);
}
}
void foo2 (__SIZE_TYPE__ len)
{
// Test that a direct call to __builtin_alloca_with_align is not confused
// with a VLA.
void *p = __builtin_alloca_with_align (len, 8); // { dg-warning "unbounded use of 'alloca'" }
useit (p);
}
void foo3 (unsigned char a)
{
if (a == 0)
useit (__builtin_alloca (a)); // { dg-warning "argument to 'alloca' is zero" }
}