zinovy.nis created this revision.
zinovy.nis added reviewers: alexfh, aaron.ballman.
zinovy.nis added a project: clang-tools-extra.
Herald added subscribers: cfe-commits, xazax.hun.

  using A = std::string;
  bool foo(A &s) {
    A S;
    if (GetValue(s) && S != (A)s)
      return false;
    return true;
  }

is fixed into (w/o this patch)

  ...
  return !GetValue(s) && S != (A)s; // negotiation affects first operand only
  }

instead of (with this patch)

  ...
  return !(GetValue(s) && S != (A)s); // note parens for the whole expression
  }


Repository:
  rCTE Clang Tools Extra

https://reviews.llvm.org/D47122

Files:
  clang-tidy/readability/SimplifyBooleanExprCheck.cpp
  test/clang-tidy/readability-simplify-bool-expr.cpp


Index: test/clang-tidy/readability-simplify-bool-expr.cpp
===================================================================
--- test/clang-tidy/readability-simplify-bool-expr.cpp
+++ test/clang-tidy/readability-simplify-bool-expr.cpp
@@ -938,3 +938,15 @@
 }
 // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return
 // CHECK-FIXES: return p->m != 0;{{$}}
+
+bool operator!=(const A&, const A&) { return false; }
+extern bool GetValue(A s);
+bool expr_with_cleanups(A &s) {
+  A S;
+  if (GetValue(s) && S != (A)s)
+    return false;
+
+  return true;
+}
+// CHECK-MESSAGES: :[[@LINE-4]]:12: warning: {{.*}} in conditional return
+// CHECK-FIXES: !(GetValue(s) && S != (A)s);{{$}}
Index: clang-tidy/readability/SimplifyBooleanExprCheck.cpp
===================================================================
--- clang-tidy/readability/SimplifyBooleanExprCheck.cpp
+++ clang-tidy/readability/SimplifyBooleanExprCheck.cpp
@@ -75,6 +75,8 @@
 
 bool needsParensAfterUnaryNegation(const Expr *E) {
   E = E->IgnoreImpCasts();
+  if (auto *EC = dyn_cast<ExprWithCleanups>(E))
+    E = EC->getSubExpr();
   if (isa<BinaryOperator>(E) || isa<ConditionalOperator>(E))
     return true;
 


Index: test/clang-tidy/readability-simplify-bool-expr.cpp
===================================================================
--- test/clang-tidy/readability-simplify-bool-expr.cpp
+++ test/clang-tidy/readability-simplify-bool-expr.cpp
@@ -938,3 +938,15 @@
 }
 // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return
 // CHECK-FIXES: return p->m != 0;{{$}}
+
+bool operator!=(const A&, const A&) { return false; }
+extern bool GetValue(A s);
+bool expr_with_cleanups(A &s) {
+  A S;
+  if (GetValue(s) && S != (A)s)
+    return false;
+
+  return true;
+}
+// CHECK-MESSAGES: :[[@LINE-4]]:12: warning: {{.*}} in conditional return
+// CHECK-FIXES: !(GetValue(s) && S != (A)s);{{$}}
Index: clang-tidy/readability/SimplifyBooleanExprCheck.cpp
===================================================================
--- clang-tidy/readability/SimplifyBooleanExprCheck.cpp
+++ clang-tidy/readability/SimplifyBooleanExprCheck.cpp
@@ -75,6 +75,8 @@
 
 bool needsParensAfterUnaryNegation(const Expr *E) {
   E = E->IgnoreImpCasts();
+  if (auto *EC = dyn_cast<ExprWithCleanups>(E))
+    E = EC->getSubExpr();
   if (isa<BinaryOperator>(E) || isa<ConditionalOperator>(E))
     return true;
 
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to