aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/Wdangling-pointer-2.c
blob: 017026394920df242733414bfd00d25fad1a6d80 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/* 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" }
}