[docs] Add LICENSE.txt to the root of the mono-repo
[llvm-project.git] / clang / test / SemaCXX / warn-tautological-compare.cpp
blob7d5b4b14e9981f7a0612f3fd3692abc0eacf39df
1 // Force x86-64 because some of our heuristics are actually based
2 // on integer sizes.
4 // RUN: %clang_cc1 -triple x86_64-apple-darwin -fsyntax-only -verify -std=c++11 %s
6 namespace RuntimeBehavior {
7 // Avoid emitting tautological compare warnings when the code already has
8 // compile time checks on variable sizes.
10 const int kintmax = 2147483647;
11 void test0(short x) {
12 if (sizeof(x) < sizeof(int) || x < kintmax) {}
14 if (x < kintmax) {}
15 // expected-warning@-1{{comparison of constant 2147483647 with expression of type 'short' is always true}}
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}}
22 if (sizeof(x) < sizeof(int))
23 return;
25 if (x < kintmax) {}
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);
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}}
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();
73 void ignore() {
74 if (a == 0) {}
75 if (0 != a) {}
76 (void)CallFunction(fun2);
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}}
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;
122 void ignored() {
123 if (&a == 0) {}
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}}
140 namespace macros {
141 #define assert(x) if (x) {}
142 int array[5];
143 void fun();
144 int x;
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}}
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}}
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}}