]> granicus.if.org Git - clang/commitdiff
Improve -Wlogical-not-parentheses to catch when the not is applied to an enum.
authorRichard Trieu <rtrieu@google.com>
Thu, 4 Jul 2013 00:50:18 +0000 (00:50 +0000)
committerRichard Trieu <rtrieu@google.com>
Thu, 4 Jul 2013 00:50:18 +0000 (00:50 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@185602 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaExpr.cpp
test/SemaCXX/warn-logical-not-compare.cpp

index c885e3f927303533ea698d0d1ef4de1c2e1e1853..6f3997eb368e6b32e48ed9eb7e89100afd570e1f 100644 (file)
@@ -7270,7 +7270,7 @@ static void diagnoseLogicalNotOnLHSofComparison(Sema &S, ExprResult &LHS,
   if (!S.getLangOpts().Bool) return;
 
   // Check that left hand side is !something.
-  UnaryOperator *UO = dyn_cast<UnaryOperator>(LHS.get());
+  UnaryOperator *UO = dyn_cast<UnaryOperator>(LHS.get()->IgnoreImpCasts());
   if (!UO || UO->getOpcode() != UO_LNot) return;
 
   // Only check if the right hand side is non-bool arithmetic type.
index 365a028511853606b263990032e4bcef917548d5..7e7e3a759225d2b120ddd69b36d8dca2b27d8a5b 100644 (file)
@@ -110,3 +110,70 @@ bool test1(int i1, int i2, bool b1, bool b2) {
   ret = !getBool() == b1;
   return ret;
 }
+
+enum E {e1, e2};
+E getE();
+
+bool test2 (E e) {
+  bool ret;
+  ret = e == e1;
+  ret = e == getE();
+  ret = getE() == e1;
+  ret = getE() == getE();
+
+  ret = !e == e1;
+  // expected-warning@-1 {{logical not is only applied to the left hand side of this comparison}}
+  // expected-note@-2 {{add parentheses after the '!' to evaluate the comparison first}}
+  // expected-note@-3 {{add parentheses around left hand side expression to silence this warning}}
+  // CHECK: to evaluate the comparison first
+  // CHECK: fix-it:"{{.*}}":{124:10-124:10}:"("
+  // CHECK: fix-it:"{{.*}}":{124:17-124:17}:")"
+  // CHECK: to silence this warning
+  // CHECK: fix-it:"{{.*}}":{124:9-124:9}:"("
+  // CHECK: fix-it:"{{.*}}":{124:11-124:11}:")"
+
+  ret = !e == getE();
+  // expected-warning@-1 {{logical not is only applied to the left hand side of this comparison}}
+  // expected-note@-2 {{add parentheses after the '!' to evaluate the comparison first}}
+  // expected-note@-3 {{add parentheses around left hand side expression to silence this warning}}
+  // CHECK: to evaluate the comparison first
+  // CHECK: fix-it:"{{.*}}":{135:10-135:10}:"("
+  // CHECK: fix-it:"{{.*}}":{135:21-135:21}:")"
+  // CHECK: to silence this warning
+  // CHECK: fix-it:"{{.*}}":{135:9-135:9}:"("
+  // CHECK: fix-it:"{{.*}}":{135:11-135:11}:")"
+
+  ret = !getE() == e1;
+  // expected-warning@-1 {{logical not is only applied to the left hand side of this comparison}}
+  // expected-note@-2 {{add parentheses after the '!' to evaluate the comparison first}}
+  // expected-note@-3 {{add parentheses around left hand side expression to silence this warning}}
+  // CHECK: to evaluate the comparison first
+  // CHECK: fix-it:"{{.*}}":{146:10-146:10}:"("
+  // CHECK: fix-it:"{{.*}}":{146:22-146:22}:")"
+  // CHECK: to silence this warning
+  // CHECK: fix-it:"{{.*}}":{146:9-146:9}:"("
+  // CHECK: fix-it:"{{.*}}":{146:16-146:16}:")"
+
+  ret = !getE() == getE();
+  // expected-warning@-1 {{logical not is only applied to the left hand side of this comparison}}
+  // expected-note@-2 {{add parentheses after the '!' to evaluate the comparison first}}
+  // expected-note@-3 {{add parentheses around left hand side expression to silence this warning}}
+  // CHECK: to evaluate the comparison first
+  // CHECK: fix-it:"{{.*}}":{157:10-157:10}:"("
+  // CHECK: fix-it:"{{.*}}":{157:26-157:26}:")"
+  // CHECK: to silence this warning
+  // CHECK: fix-it:"{{.*}}":{157:9-157:9}:"("
+  // CHECK: fix-it:"{{.*}}":{157:16-157:16}:")"
+
+  ret = !(e == e1);
+  ret = !(e == getE());
+  ret = !(getE() == e1);
+  ret = !(getE() == getE());
+
+  ret = (!e) == e1;
+  ret = (!e) == getE();
+  ret = (!getE()) == e1;
+  ret = (!getE()) == getE();
+
+  return ret;
+}