| /* 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 *-*-* } } | |
| } |