| /* PR middle-end/63272 - GCC should warn when using pointer to dead scoped | |
| variable within the same function | |
| Exercise -Wdangling-pointer for escaping stores of addreses of auto | |
| variables. | |
| { dg-do compile } | |
| { dg-options "-O0 -Wall -ftrack-macro-expansion=0" } | |
| { dg-require-effective-target alloca } */ | |
| void* alloca (__SIZE_TYPE__); | |
| void* sink (void*, ...); | |
| extern void *evp; | |
| void nowarn_store_extern_call (void) | |
| { | |
| int x; | |
| evp = &x; | |
| sink (0); | |
| } | |
| void nowarn_store_extern_ovrwrite (void) | |
| { | |
| int x; | |
| evp = &x; | |
| evp = 0; | |
| } | |
| void nowarn_store_extern_store (void) | |
| { | |
| int x; | |
| void **p = (void**)sink (&evp); | |
| evp = &x; | |
| *p = 0; | |
| } | |
| void warn_store_alloca (int n) | |
| { | |
| // This fails because of a bug in the warning. | |
| void *p = alloca (n); | |
| evp = p; // { dg-warning "storing the address of local variable 'x' in 'evp1'" "pr??????" { xfail *-*-* } } | |
| } | |
| void warn_store_extern (void) | |
| { | |
| extern void *evp1; // { dg-message "'evp1' declared here" } | |
| int x; // { dg-message "'x' declared here" } | |
| evp1 = &x; // { dg-warning "storing the address of local variable 'x' in 'evp1'" } | |
| } | |
| void nowarn_store_arg_call (void **vpp) | |
| { | |
| int x; | |
| *vpp = &x; | |
| sink (0); | |
| } | |
| void nowarn_store_arg_ovrwrite (void **vpp) | |
| { | |
| int x; | |
| *vpp = &x; | |
| *vpp = 0; | |
| } | |
| void nowarn_store_arg_store (void **vpp) | |
| { | |
| int x; | |
| void **p = (void**)sink (0); | |
| *vpp = &x; | |
| *p = 0; | |
| } | |
| void* nowarn_store_arg_store_arg (void **vpp1, void **vpp2) | |
| { | |
| int x; | |
| void **p = (void**)sink (0); | |
| *vpp1 = &x; // warn here? | |
| *vpp2 = 0; // might overwrite *vpp1 | |
| return p; | |
| } | |
| void warn_store_arg (void **vpp) | |
| { | |
| int x; // { dg-message "'x' declared here" } | |
| *vpp = &x; // { dg-warning "storing the address of local variable 'x' in '\\*vpp'" } | |
| } | |