]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/testsuite/gcc.dg/Wdangling-pointer-2.c
Add -Wdangling-pointer [PR63272].
[thirdparty/gcc.git] / gcc / testsuite / gcc.dg / Wdangling-pointer-2.c
1 /* Exercise conditional C-only uses of dangling pointers with optimization.
2 { dg-do compile }
3 { dg-options "-O2 -Wall" } */
4
5 typedef __SIZE_TYPE__ size_t;
6
7 extern void* memchr (const void*, int, size_t);
8 extern char* strchr (const char*, int);
9
10 void sink (void*, ...);
11
12
13 void nowarn_compound_literal (int i, int j)
14 {
15 {
16 int *p = i ? (int[]){ 1, 2, 3 } : (int[]){ 4, 5, 6 };
17 sink (p);
18 }
19 {
20 int a[] = { 1, 2, 3 };
21 int *q = i ? (int[]){ 4, 5, 6 } : a;
22 int *p = &q[1];
23 sink (p);
24 }
25 {
26 int *p = i ? (int[]){ 1, 2, 3 } : (int[]){ 4, 5, 6 };
27 int *q = __builtin_memchr (p, 2, 3 * sizeof *p);
28 sink (q);
29 }
30 {
31 int a[] = { i, i + 1, i + 2, 3 };
32 int *p = i ? (int[]){ j, j + 1, j + 2, 3 } : a;
33 int *q = __builtin_memchr (p, 3, 4 * sizeof *p);
34 sink (q);
35 }
36 }
37
38
39 void warn_maybe_compound_literal (int i, int j)
40 {
41 int a[] = { 1, 2, 3 }, *p;
42 {
43 p = i ? (int[]){ 4, 5, 6 } : a;
44 }
45 // When the 'p' is optimized away it's not mentioned in the warning.
46 sink (p); // { dg-warning "dangling pointer \('p' \)?to an unnamed temporary may be used" }
47 }
48
49
50 void warn_maybe_compound_literal_memchr (int i, int j, int x)
51 {
52 int a[] = { 1, 2, 3 }, *p;
53 {
54 int *q = i ? (int[]){ 4, 5, 6 } : a;
55 p = memchr (q, x, 3 * sizeof *q);
56 }
57 sink (p); // { dg-warning "dangling pointer 'p' to an unnamed temporary may be used" }
58 }
59
60
61 void warn_maybe_array (int i, int j)
62 {
63 int a[] = { 1, 2, 3 }, *p;
64 {
65 int b[] = { 4, 5, 6 };
66 p = i ? a : b;
67 }
68 // When the 'p' is optimized away it's not mentioned in the warning.
69 sink (p); // { dg-warning "dangling pointer \('p' \)?to 'b' may be used" }
70 }
71
72
73 void warn_maybe_array_memchr (int i, int j, int x)
74 {
75 int a[] = { 1, 2, 3 }, *p;
76 {
77 int b[] = { 4, 5, 6 };
78 int *q = i ? a : b;
79 p = memchr (q, x, 3 * sizeof *q);
80 }
81 sink (p); // { dg-warning "dangling pointer 'p' to 'b' may be used" }
82 }