1 | // Force x86-64 because some of our heuristics are actually based |
2 | // on integer sizes. |
3 | |
4 | // RUN: %clang_cc1 -triple x86_64-apple-darwin -fsyntax-only -verify -std=c++11 %s |
5 | |
6 | namespace RuntimeBehavior { |
7 | // Avoid emitting tautological compare warnings when the code already has |
8 | // compile time checks on variable sizes. |
9 | |
10 | const int kintmax = 2147483647; |
11 | void test0(short x) { |
12 | if (sizeof(x) < sizeof(int) || x < kintmax) {} |
13 | |
14 | if (x < kintmax) {} |
15 | // expected-warning@-1{{comparison of constant 2147483647 with expression of type 'short' is always true}} |
16 | } |
17 | |
18 | void test1(short x) { |
19 | if (x < kintmax) {} |
20 | // expected-warning@-1{{comparison of constant 2147483647 with expression of type 'short' is always true}} |
21 | |
22 | if (sizeof(x) < sizeof(int)) |
23 | return; |
24 | |
25 | if (x < kintmax) {} |
26 | } |
27 | } |
28 | |
29 | namespace ArrayCompare { |
30 | #define GetValue(ptr) ((ptr != 0) ? ptr[0] : 0) |
31 | extern int a[] __attribute__((weak)); |
32 | int b[] = {8,13,21}; |
33 | struct { |
34 | int x[10]; |
35 | } c; |
36 | const char str[] = "text"; |
37 | void ignore() { |
38 | if (a == 0) {} |
39 | if (a != 0) {} |
40 | (void)GetValue(b); |
41 | } |
42 | void test() { |
43 | if (b == 0) {} |
44 | // expected-warning@-1{{comparison of array 'b' equal to a null pointer is always false}} |
45 | if (b != 0) {} |
46 | // expected-warning@-1{{comparison of array 'b' not equal to a null pointer is always true}} |
47 | if (0 == b) {} |
48 | // expected-warning@-1{{comparison of array 'b' equal to a null pointer is always false}} |
49 | if (0 != b) {} |
50 | // expected-warning@-1{{comparison of array 'b' not equal to a null pointer is always true}} |
51 | if (c.x == 0) {} |
52 | // expected-warning@-1{{comparison of array 'c.x' equal to a null pointer is always false}} |
53 | if (c.x != 0) {} |
54 | // expected-warning@-1{{comparison of array 'c.x' not equal to a null pointer is always true}} |
55 | if (str == 0) {} |
56 | // expected-warning@-1{{comparison of array 'str' equal to a null pointer is always false}} |
57 | if (str != 0) {} |
58 | // expected-warning@-1{{comparison of array 'str' not equal to a null pointer is always true}} |
59 | } |
60 | } |
61 | |
62 | namespace FunctionCompare { |
63 | #define CallFunction(f) ((f != 0) ? f() : 0) |
64 | extern void a() __attribute__((weak)); |
65 | void fun1(); |
66 | int fun2(); |
67 | int* fun3(); |
68 | int* fun4(int); |
69 | class S { |
70 | public: |
71 | static int foo(); |
72 | }; |
73 | void ignore() { |
74 | if (a == 0) {} |
75 | if (0 != a) {} |
76 | (void)CallFunction(fun2); |
77 | } |
78 | void test() { |
79 | if (fun1 == 0) {} |
80 | // expected-warning@-1{{comparison of function 'fun1' equal to a null pointer is always false}} |
81 | // expected-note@-2{{prefix with the address-of operator to silence this warning}} |
82 | if (fun2 == 0) {} |
83 | // expected-warning@-1{{comparison of function 'fun2' equal to a null pointer is always false}} |
84 | // expected-note@-2{{prefix with the address-of operator to silence this warning}} |
85 | // expected-note@-3{{suffix with parentheses to turn this into a function call}} |
86 | if (fun3 == 0) {} |
87 | // expected-warning@-1{{comparison of function 'fun3' equal to a null pointer is always false}} |
88 | // expected-note@-2{{prefix with the address-of operator to silence this warning}} |
89 | // expected-note@-3{{suffix with parentheses to turn this into a function call}} |
90 | if (fun4 == 0) {} |
91 | // expected-warning@-1{{comparison of function 'fun4' equal to a null pointer is always false}} |
92 | // expected-note@-2{{prefix with the address-of operator to silence this warning}} |
93 | if (nullptr != fun1) {} |
94 | // expected-warning@-1{{comparison of function 'fun1' not equal to a null pointer is always true}} |
95 | // expected-note@-2{{prefix with the address-of operator to silence this warning}} |
96 | if (nullptr != fun2) {} |
97 | // expected-warning@-1{{comparison of function 'fun2' not equal to a null pointer is always true}} |
98 | // expected-note@-2{{prefix with the address-of operator to silence this warning}} |
99 | if (nullptr != fun3) {} |
100 | // expected-warning@-1{{comparison of function 'fun3' not equal to a null pointer is always true}} |
101 | // expected-note@-2{{prefix with the address-of operator to silence this warning}} |
102 | // expected-note@-3{{suffix with parentheses to turn this into a function call}} |
103 | if (nullptr != fun4) {} |
104 | // expected-warning@-1{{comparison of function 'fun4' not equal to a null pointer is always true}} |
105 | // expected-note@-2{{prefix with the address-of operator to silence this warning}} |
106 | if (S::foo == 0) {} |
107 | // expected-warning@-1{{comparison of function 'S::foo' equal to a null pointer is always false}} |
108 | // expected-note@-2{{prefix with the address-of operator to silence this warning}} |
109 | // expected-note@-3{{suffix with parentheses to turn this into a function call}} |
110 | } |
111 | } |
112 | |
113 | namespace PointerCompare { |
114 | extern int a __attribute__((weak)); |
115 | int b; |
116 | static int c; |
117 | class S { |
118 | public: |
119 | static int a; |
120 | int b; |
121 | }; |
122 | void ignored() { |
123 | if (&a == 0) {} |
124 | } |
125 | void test() { |
126 | S s; |
127 | if (&b == 0) {} |
128 | // expected-warning@-1{{comparison of address of 'b' equal to a null pointer is always false}} |
129 | if (&c == 0) {} |
130 | // expected-warning@-1{{comparison of address of 'c' equal to a null pointer is always false}} |
131 | if (&s.a == 0) {} |
132 | // expected-warning@-1{{comparison of address of 's.a' equal to a null pointer is always false}} |
133 | if (&s.b == 0) {} |
134 | // expected-warning@-1{{comparison of address of 's.b' equal to a null pointer is always false}} |
135 | if (&S::a == 0) {} |
136 | // expected-warning@-1{{comparison of address of 'S::a' equal to a null pointer is always false}} |
137 | } |
138 | } |
139 | |
140 | namespace macros { |
141 | #define assert(x) if (x) {} |
142 | int array[5]; |
143 | void fun(); |
144 | int x; |
145 | |
146 | void test() { |
147 | assert(array == 0); |
148 | // expected-warning@-1{{comparison of array 'array' equal to a null pointer is always false}} |
149 | assert(array != 0); |
150 | // expected-warning@-1{{comparison of array 'array' not equal to a null pointer is always true}} |
151 | assert(array == 0 && "expecting null pointer"); |
152 | // expected-warning@-1{{comparison of array 'array' equal to a null pointer is always false}} |
153 | assert(array != 0 && "expecting non-null pointer"); |
154 | // expected-warning@-1{{comparison of array 'array' not equal to a null pointer is always true}} |
155 | |
156 | assert(fun == 0); |
157 | // expected-warning@-1{{comparison of function 'fun' equal to a null pointer is always false}} |
158 | // expected-note@-2{{prefix with the address-of operator to silence this warning}} |
159 | assert(fun != 0); |
160 | // expected-warning@-1{{comparison of function 'fun' not equal to a null pointer is always true}} |
161 | // expected-note@-2{{prefix with the address-of operator to silence this warning}} |
162 | assert(fun == 0 && "expecting null pointer"); |
163 | // expected-warning@-1{{comparison of function 'fun' equal to a null pointer is always false}} |
164 | // expected-note@-2{{prefix with the address-of operator to silence this warning}} |
165 | assert(fun != 0 && "expecting non-null pointer"); |
166 | // expected-warning@-1{{comparison of function 'fun' not equal to a null pointer is always true}} |
167 | // expected-note@-2{{prefix with the address-of operator to silence this warning}} |
168 | |
169 | assert(&x == 0); |
170 | // expected-warning@-1{{comparison of address of 'x' equal to a null pointer is always false}} |
171 | assert(&x != 0); |
172 | // expected-warning@-1{{comparison of address of 'x' not equal to a null pointer is always true}} |
173 | assert(&x == 0 && "expecting null pointer"); |
174 | // expected-warning@-1{{comparison of address of 'x' equal to a null pointer is always false}} |
175 | assert(&x != 0 && "expecting non-null pointer"); |
176 | // expected-warning@-1{{comparison of address of 'x' not equal to a null pointer is always true}} |
177 | } |
178 | } |
179 | |