| /* PR middle-end/63272 - GCC should warn when using pointer to dead scoped | |
| variable within the same function | |
| Exercise conditional uses dangling pointers with optimization. | |
| { dg-do compile } | |
| { dg-options "-O2 -Wall -Wno-maybe-uninitialized" } */ | |
| typedef __INTPTR_TYPE__ intptr_t; | |
| typedef __SIZE_TYPE__ size_t; | |
| #if __cplusplus | |
| # define EXTERN_C extern "C" | |
| #else | |
| # define EXTERN_C extern | |
| #endif | |
| EXTERN_C void* memcpy (void*, const void*, size_t); | |
| void sink (const void*, ...); | |
| char* nowarn_conditional (char *s) | |
| { | |
| // Reduced from Glibc's tmpnam.c. | |
| extern char a[5]; | |
| char b[5]; | |
| char *p = s ? s : b; | |
| sink (p); | |
| if (s == 0) | |
| return a; | |
| return s; | |
| } | |
| char* nowarn_conditional_memcpy (char *s) | |
| { | |
| // Reduced from Glibc's tmpnam.c. | |
| extern char a[5]; | |
| char b[5]; | |
| char *p = s ? s : b; | |
| sink (p); | |
| if (s == 0) | |
| return (char*)memcpy (a, p, 5); | |
| return s; | |
| } | |
| int warn_conditional_block (int i) | |
| { | |
| int *p; | |
| if (i) | |
| { | |
| int a[] = { 1, 2, 3 }; | |
| p = &a[i]; | |
| } | |
| else | |
| p = &i; | |
| return *p; // { dg-warning "dangling pointer \('p' \)to 'a' may be used" } | |
| } |