[clang] [Clang] Improve ``-Wtautological-overlap-compare`` diagnostics flag (PR #133653)

via cfe-commits cfe-commits at lists.llvm.org
Mon Apr 14 14:26:53 PDT 2025


================
@@ -169,7 +169,84 @@ int struct_test(struct A a) {
   return a.x > 5 && a.y < 1;  // no warning, different variables
 
   return a.x > 5 && a.x < 1;
-  // expected-warning at -1{{overlapping comparisons always evaluate to false}}
+  // expected-warning at -1{{non-overlapping comparisons always evaluate to false}}
   return a.y == 1 || a.y != 1;
   // expected-warning at -1{{overlapping comparisons always evaluate to true}}
 }
+
+void char_tests(char c) {
+  if (c > 'a' || c < 'z') {}
+  // expected-warning at -1{{overlapping comparisons always evaluate to true}}
+  if (c > 'z' && c < 'a') {}
+  // expected-warning at -1{{non-overlapping comparisons always evaluate to false}}
+  if (c == 'a' && c == 'z') {}
+  // expected-warning at -1{{non-overlapping comparisons always evaluate to false}}
+  if (c != 'a' || c != 'z') {}
+  // expected-warning at -1{{overlapping comparisons always evaluate to true}}
+}
+
+void float_tests(float f) {
+  if (f > 1.0 || f < 2.0) {}
+  // expected-warning at -1{{overlapping comparisons always evaluate to true}}
----------------
Sirraide wrote:

Hmm, actually, what about `nan`? Because `nan > anything` is `false` and `anything < nan` is `false`, so this can still be `false`. This is fine for the ‘always evaluate to `false`’ cases, but I’m not sure we can claim that a disjunction/conjunction of floating-point comparisons ‘always evaluates to `true`’ unfortunately...

https://github.com/llvm/llvm-project/pull/133653


More information about the cfe-commits mailing list