| /* { dg-do compile } */ |
| /* { dg-require-effective-target stdint_types } */ |
| /* { dg-require-effective-target alloca } */ |
| /* { dg-options "-O2 -Wvla-larger-than=40" } */ |
| |
| #include <stdint.h> |
| |
| void f0 (void *); |
| void |
| f1 (__SIZE_TYPE__ a) |
| { |
| if (a <= 10) |
| { |
| // 10 * 4 bytes = 40: OK! |
| uint32_t x[a]; |
| f0 (x); |
| } |
| } |
| |
| void |
| f2 (__SIZE_TYPE__ a) |
| { |
| if (a <= 11) |
| { |
| // 11 * 4 bytes = 44: Not OK. |
| uint32_t x[a]; // { dg-warning "array may be too large" } |
| f0 (x); |
| } |
| } |
| |
| void |
| f3 (__SIZE_TYPE__ a, __SIZE_TYPE__ b) |
| { |
| if (a <= 5 && b <= 3) |
| { |
| // 5 * 3 * 4 bytes = 60: Not OK. |
| uint32_t x[a][b]; // { dg-warning "array may be too large" } |
| f0 (x); |
| } |
| } |
| |
| void |
| f4 (__SIZE_TYPE__ a, __SIZE_TYPE__ b) |
| { |
| if (a <= 5 && b <= 2) |
| { |
| // 5 * 2 * 4 bytes = 40 bytes: OK! |
| uint32_t x[a][b]; |
| f0 (x); |
| } |
| } |
| |
| void |
| f5 (__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); |
| f0 (p); |
| } |
| |
| void |
| f6 (unsigned stuff) |
| { |
| int n = 7000; |
| do { |
| char a[n]; // { dg-warning "variable-length array is too large" } |
| f0 (a); |
| } while (stuff--); |
| } |