1 /* PR c/102103 - missing warning comparing array address to null
2 { dg-do compile }
3 { dg-options "-Wall" } */
4
5 typedef __INTPTR_TYPE__ intptr_t;
6 typedef __UINTPTR_TYPE__ uintptr_t;
7
8 #ifndef __cplusplus
9 # define bool _Bool
10 #endif
11
12 struct S { void *p, *a1[2], *a2[2][2]; } s, *p;
13
14 extern const void *a1[2];
15 extern void *a2[2][2], *ax[];
16
17 void T (bool);
18
19 void test_array_eq_0 (int i)
20 {
21 // Verify that casts intptr_t suppress the warning.
22 T ((intptr_t)a1 == 0);
23 T ((uintptr_t)a1 == 0);
24 T (a1 == 0); // { dg-warning "-Waddress" }
25 T (0 == &a1); // { dg-warning "-Waddress" }
26 // Verify that casts to other pointer types don't suppress it.
27 T ((void *)a1 == 0); // { dg-warning "-Waddress" }
28 T ((char *)a1 == 0); // { dg-warning "-Waddress" }
29 T (a1[0] == 0);
30 T (0 == (intptr_t)&a1[0]);
31 T (0 == &a1[0]); // { dg-warning "-Waddress" }
32 T (a1[i] == 0);
33 T (0 == (uintptr_t)&a1[i]);
34 T (0 == &a1[i]); // { dg-warning "-Waddress" }
35
36 T ((intptr_t)a2 == 0);
37 T (a2 == 0); // { dg-warning "-Waddress" }
38 T (0 == &a2); // { dg-warning "-Waddress" }
39 T (a2[0] == 0); // { dg-warning "-Waddress" }
40 T (0 == &a1[0]); // { dg-warning "-Waddress" }
41 T (a2[i] == 0); // { dg-warning "-Waddress" }
42 T (0 == &a2[i]); // { dg-warning "-Waddress" }
43 T (a2[0][0] == 0);
44 T (0 == &a2[0][0]); // { dg-warning "-Waddress" }
45 T (&ax == 0); // { dg-warning "-Waddress" }
46 T (0 == &ax); // { dg-warning "-Waddress" }
47 T (&ax[0] == 0); // { dg-warning "-Waddress" }
48 T (0 == ax[0]);
49 }
50
51
52 void test_array_neq_0 (int i)
53 {
54 // Verify that casts to intptr_t suppress the warning.
55 T ((uintptr_t)a1);
56
57 T (a1); // { dg-warning "-Waddress" }
58 T ((void *)a1); // { dg-warning "-Waddress" }
59 T (&a1 != 0); // { dg-warning "-Waddress" }
60 T (a1[0]);
61 T (&a1[0] != 0); // { dg-warning "-Waddress" }
62 T (a1[i]);
63 T (&a1[i] != 0); // { dg-warning "-Waddress" }
64
65 T ((intptr_t)a2);
66 T (a2); // { dg-warning "-Waddress" }
67 T ((void *)a2); // { dg-warning "-Waddress" }
68 T ((char *)a2); // { dg-warning "-Waddress" }
69 T (&a2 != 0); // { dg-warning "-Waddress" }
70 T (a2[0]); // { dg-warning "-Waddress" }
71 T (&a1[0] != 0); // { dg-warning "-Waddress" }
72 T (a2[i]); // { dg-warning "-Waddress" }
73 T (&a2[i] != 0); // { dg-warning "-Waddress" }
74 T (a2[0][0]);
75 T (&a2[0][0] != 0); // { dg-warning "-Waddress" }
76 }
77
78
79 void test_member_array_eq_0 (int i)
80 {
81 // Verify that casts to intptr_t suppress the warning.
82 T ((intptr_t)s.a1 == 0);
83 T (s.a1 == 0); // { dg-warning "-Waddress" }
84 T (0 == &a1); // { dg-warning "-Waddress" }
85 T (s.a1[0] == 0);
86 T ((void*)s.a1); // { dg-warning "-Waddress" }
87 T (0 == &a1[0]); // { dg-warning "-Waddress" }
88 T (s.a1[i] == 0);
89 T (0 == &a1[i]); // { dg-warning "-Waddress" }
90
91 T ((uintptr_t)s.a2 == 0);
92 T (s.a2 == 0); // { dg-warning "-Waddress" }
93 T (0 == &a2); // { dg-warning "-Waddress" }
94 T ((void *)s.a2 == 0);// { dg-warning "-Waddress" }
95 T (s.a2[0] == 0); // { dg-warning "-Waddress" }
96 T (0 == &a1[0]); // { dg-warning "-Waddress" }
97 T (s.a2[i] == 0); // { dg-warning "-Waddress" }
98 T (0 == &a2[i]); // { dg-warning "-Waddress" }
99 T (s.a2[0][0] == 0);
100 T (0 == &a2[0][0]); // { dg-warning "-Waddress" }
101 }
102
103
104 void test_member_array_neq_0 (int i)
105 {
106 // Verify that casts to intptr_t suppress the warning.
107 T ((uintptr_t)s.a1);
108 T (s.a1); // { dg-warning "-Waddress" }
109 T (&s.a1 != 0); // { dg-warning "-Waddress" }
110 T ((void *)&s.a1[0]); // { dg-warning "-Waddress" }
111 T (s.a1[0]);
112 T (&s.a1[0] != 0); // { dg-warning "-Waddress" }
113 T (s.a1[i]);
114 T (&s.a1[i] != 0); // { dg-warning "-Waddress" }
115
116 T ((intptr_t)s.a2);
117 T (s.a2); // { dg-warning "-Waddress" }
118 T (&s.a2 != 0); // { dg-warning "-Waddress" }
119 T (s.a2[0]); // { dg-warning "-Waddress" }
120 T (&s.a1[0] != 0); // { dg-warning "-Waddress" }
121 T (s.a2[i]); // { dg-warning "-Waddress" }
122 T (&s.a2[i] != 0); // { dg-warning "-Waddress" }
123 T (s.a2[0][0]);
124 T (&s.a2[0][0] != 0); // { dg-warning "-Waddress" }
125 }