blob: 017026394920df242733414bfd00d25fad1a6d80 [file] [log] [blame]
/* 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" }
}