| /* PR29970, PR91038 */ |
| /* { dg-do run } */ |
| /* { dg-options "-O2 -Wunused-variable" } */ |
| |
| int foo3b(void) // should not return 0 |
| { |
| int n = 0; |
| return sizeof *({ n = 10; int x[n]; &x; }); |
| } |
| |
| int foo4(void) // should not ICE |
| { |
| return (*({ |
| int n = 20; |
| char (*x)[n][n] = __builtin_malloc(n * n); |
| (*x)[12][1] = 1; |
| x; |
| }))[12][1]; |
| } |
| |
| int foo5(void) // should return 1, returns 0 |
| { |
| int n = 0; |
| return (*({ |
| n = 20; |
| char (*x)[n][n] = __builtin_malloc(n * n); |
| (*x)[12][1] = 1; |
| (*x)[0][1] = 0; |
| x; |
| }))[12][1]; |
| } |
| |
| int foo5c(void) // should return 400 |
| { |
| int n = 0; |
| return sizeof(*({ |
| n = 20; |
| char (*x)[n][n] = __builtin_malloc(n * n); |
| (*x)[12][1] = 1; |
| (*x)[0][1] = 0; |
| x; |
| })); |
| } |
| |
| int foo5b(void) // should return 1, returns 0 |
| { |
| int n = 0; /* { dg-warning "unused variable" } */ |
| return (*({ |
| int n = 20; |
| char (*x)[n][n] = __builtin_malloc(n * n); |
| (*x)[12][1] = 1; |
| (*x)[0][1] = 0; |
| x; |
| }))[12][1]; |
| } |
| |
| int foo5a(void) // should return 1, returns 0 |
| { |
| return (*({ |
| int n = 20; |
| char (*x)[n][n] = __builtin_malloc(n * n); |
| (*x)[12][1] = 1; |
| (*x)[0][1] = 0; |
| x; |
| }))[12][1]; |
| } |
| |
| |
| |
| |
| int main() |
| { |
| if (sizeof(int[10]) != foo3b()) |
| __builtin_abort(); |
| |
| if (1 != foo4()) |
| __builtin_abort(); |
| |
| if (400 != foo5c()) |
| __builtin_abort(); |
| |
| if (1 != foo5a()) |
| __builtin_abort(); |
| |
| if (1 != foo5b()) // -O0 |
| __builtin_abort(); |
| |
| if (1 != foo5()) |
| __builtin_abort(); |
| |
| return 0; |
| } |
| |
| |