| /* PR middle-end/63272 - GCC should warn when using pointer to dead scoped |
| variable within the same function |
| Exercise -Wdangling-pointer for VLAs. |
| { dg-do compile } |
| { dg-options "-O0 -Wall -ftrack-macro-expansion=0" } |
| { dg-require-effective-target alloca } */ |
| |
| void sink (void*, ...); |
| |
| void nowarn_vla (int n) |
| { |
| { |
| int vla1[n]; |
| int *p1 = vla1; |
| sink (p1); |
| |
| { |
| int vla2[n]; |
| int *p2 = vla2; |
| sink (p1, p2); |
| |
| { |
| int vla3[n]; |
| int *p3 = vla3; |
| sink (p1, p2, p3); |
| } |
| sink (p1, p2); |
| } |
| sink (p1); |
| } |
| } |
| |
| void warn_one_vla (int n) |
| { |
| int *p; |
| { |
| int vla[n]; // { dg-message "'vla' declared" "pr??????" { xfail *-*-* } } |
| p = vla; |
| } |
| sink (p); // { dg-warning "using a dangling pointer to 'vla'" "vla" { xfail *-*-* } } |
| } |
| |
| |
| void warn_two_vlas_same_block (int n) |
| { |
| int *p, *q; |
| { |
| int vla1[n]; // { dg-message "'vla1' declared" "pr??????" { xfail *-*-* } } |
| int vla2[n]; // { dg-message "'vla2' declared" "pr??????" { xfail *-*-* } } |
| p = vla1; |
| q = vla2; |
| } |
| |
| sink (p); // { dg-warning "using a dangling pointer to 'vla1'" "vla" { xfail *-*-* } } |
| sink (q); // { dg-warning "using a dangling pointer to 'vla2'" "vla" { xfail *-*-* } } |
| } |
| |
| |
| void warn_two_vlas_in_series (int n) |
| { |
| int *p; |
| { |
| int vla1[n]; // { dg-message "'vla1' declared" "pr??????" { xfail *-*-* } } |
| p = vla1; |
| } |
| sink (p); // { dg-warning "using a dangling pointer to 'vla1'" "vla" { xfail *-*-* } } |
| |
| int *q; |
| { |
| int vla2[n]; // { dg-message "'vla2' declared" "pr??????" { xfail *-*-* } } |
| q = vla2; |
| } |
| sink (q); // { dg-warning "using a dangling pointer to 'vla2'" "vla" { xfail *-*-* } } |
| } |