| /* Exercise conditional C-only uses of dangling pointers with optimization. |
| { dg-do compile } |
| { dg-options "-O2 -Wall" } */ |
| |
| typedef __SIZE_TYPE__ size_t; |
| |
| extern void* memchr (const void*, int, size_t); |
| extern char* strchr (const char*, int); |
| |
| void sink (void*, ...); |
| |
| |
| void nowarn_compound_literal (int i, int j) |
| { |
| { |
| int *p = i ? (int[]){ 1, 2, 3 } : (int[]){ 4, 5, 6 }; |
| sink (p); |
| } |
| { |
| int a[] = { 1, 2, 3 }; |
| int *q = i ? (int[]){ 4, 5, 6 } : a; |
| int *p = &q[1]; |
| sink (p); |
| } |
| { |
| int *p = i ? (int[]){ 1, 2, 3 } : (int[]){ 4, 5, 6 }; |
| int *q = __builtin_memchr (p, 2, 3 * sizeof *p); |
| sink (q); |
| } |
| { |
| int a[] = { i, i + 1, i + 2, 3 }; |
| int *p = i ? (int[]){ j, j + 1, j + 2, 3 } : a; |
| int *q = __builtin_memchr (p, 3, 4 * sizeof *p); |
| sink (q); |
| } |
| } |
| |
| |
| void warn_maybe_compound_literal (int i, int j) |
| { |
| int a[] = { 1, 2, 3 }, *p; |
| { |
| p = i ? (int[]){ 4, 5, 6 } : a; |
| } |
| // When the 'p' is optimized away it's not mentioned in the warning. |
| sink (p); // { dg-warning "dangling pointer \('p' \)?to an unnamed temporary may be used" } |
| } |
| |
| |
| void warn_maybe_compound_literal_memchr (int i, int j, int x) |
| { |
| int a[] = { 1, 2, 3 }, *p; |
| { |
| int *q = i ? (int[]){ 4, 5, 6 } : a; |
| p = memchr (q, x, 3 * sizeof *q); |
| } |
| sink (p); // { dg-warning "dangling pointer 'p' to an unnamed temporary may be used" } |
| } |
| |
| |
| void warn_maybe_array (int i, int j) |
| { |
| int a[] = { 1, 2, 3 }, *p; |
| { |
| int b[] = { 4, 5, 6 }; |
| p = i ? a : b; |
| } |
| // When the 'p' is optimized away it's not mentioned in the warning. |
| sink (p); // { dg-warning "dangling pointer \('p' \)?to 'b' may be used" } |
| } |
| |
| |
| void warn_maybe_array_memchr (int i, int j, int x) |
| { |
| int a[] = { 1, 2, 3 }, *p; |
| { |
| int b[] = { 4, 5, 6 }; |
| int *q = i ? a : b; |
| p = memchr (q, x, 3 * sizeof *q); |
| } |
| sink (p); // { dg-warning "dangling pointer 'p' to 'b' may be used" } |
| } |