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