Viewing file: Wvla-larger-than-2.c (1.18 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
/* { 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--); }
|