<div dir="ltr">Do you have some data on the true/false positive rate for this warning?</div><br><div class="gmail_quote"><div dir="ltr">On Fri, Sep 23, 2016 at 6:12 AM Daniel Marjamäki <<a href="mailto:daniel.marjamaki@evidente.se">daniel.marjamaki@evidente.se</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">danielmarjamaki created this revision.<br class="gmail_msg">
danielmarjamaki added reviewers: dblaikie, rtrieu.<br class="gmail_msg">
danielmarjamaki added a subscriber: cfe-commits.<br class="gmail_msg">
danielmarjamaki set the repository for this revision to rL LLVM.<br class="gmail_msg">
<br class="gmail_msg">
This patch makes Clang warn about following code:<br class="gmail_msg">
<br class="gmail_msg">
    a = (b * c >> 2);<br class="gmail_msg">
<br class="gmail_msg">
It might be a good idea to use parentheses to clarify the operator precedence.<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
Repository:<br class="gmail_msg">
  rL LLVM<br class="gmail_msg">
<br class="gmail_msg">
<a href="https://reviews.llvm.org/D24861" rel="noreferrer" class="gmail_msg" target="_blank">https://reviews.llvm.org/D24861</a><br class="gmail_msg">
<br class="gmail_msg">
Files:<br class="gmail_msg">
  lib/Sema/SemaExpr.cpp<br class="gmail_msg">
  test/Sema/parentheses.cpp<br class="gmail_msg">
<br class="gmail_msg">
Index: test/Sema/parentheses.cpp<br class="gmail_msg">
===================================================================<br class="gmail_msg">
--- test/Sema/parentheses.cpp<br class="gmail_msg">
+++ test/Sema/parentheses.cpp<br class="gmail_msg">
@@ -95,6 +95,21 @@<br class="gmail_msg">
   // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:10-[[@LINE-2]]:10}:"("<br class="gmail_msg">
   // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:15-[[@LINE-3]]:15}:")"<br class="gmail_msg">
<br class="gmail_msg">
+  (void)(a >> b * c); // expected-warning {{operator '>>' has lower precedence than '*'; '*' will be evaluated first}} \<br class="gmail_msg">
+                         expected-note {{place parentheses around the '*' expression to silence this warning}}<br class="gmail_msg">
+  // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:15-[[@LINE-2]]:15}:"("<br class="gmail_msg">
+  // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:20-[[@LINE-3]]:20}:")"<br class="gmail_msg">
+<br class="gmail_msg">
+  (void)(a / b << c); // expected-warning {{operator '<<' has lower precedence than '/'; '/' will be evaluated first}} \<br class="gmail_msg">
+                         expected-note {{place parentheses around the '/' expression to silence this warning}}<br class="gmail_msg">
+  // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:10-[[@LINE-2]]:10}:"("<br class="gmail_msg">
+  // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:15-[[@LINE-3]]:15}:")"<br class="gmail_msg">
+<br class="gmail_msg">
+  (void)(a % b << c); // expected-warning {{operator '<<' has lower precedence than '%'; '%' will be evaluated first}} \<br class="gmail_msg">
+                         expected-note {{place parentheses around the '%' expression to silence this warning}}<br class="gmail_msg">
+  // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:10-[[@LINE-2]]:10}:"("<br class="gmail_msg">
+  // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:15-[[@LINE-3]]:15}:")"<br class="gmail_msg">
+<br class="gmail_msg">
   Stream() << b + c;<br class="gmail_msg">
   Stream() >> b + c; // expected-warning {{operator '>>' has lower precedence than '+'; '+' will be evaluated first}} \<br class="gmail_msg">
                         expected-note {{place parentheses around the '+' expression to silence this warning}}<br class="gmail_msg">
Index: lib/Sema/SemaExpr.cpp<br class="gmail_msg">
===================================================================<br class="gmail_msg">
--- lib/Sema/SemaExpr.cpp<br class="gmail_msg">
+++ lib/Sema/SemaExpr.cpp<br class="gmail_msg">
@@ -11246,10 +11246,10 @@<br class="gmail_msg">
   }<br class="gmail_msg">
 }<br class="gmail_msg">
<br class="gmail_msg">
-static void DiagnoseAdditionInShift(Sema &S, SourceLocation OpLoc,<br class="gmail_msg">
+static void DiagnoseAddOrMulInShift(Sema &S, SourceLocation OpLoc,<br class="gmail_msg">
                                     Expr *SubExpr, StringRef Shift) {<br class="gmail_msg">
   if (BinaryOperator *Bop = dyn_cast<BinaryOperator>(SubExpr)) {<br class="gmail_msg">
-    if (Bop->getOpcode() == BO_Add || Bop->getOpcode() == BO_Sub) {<br class="gmail_msg">
+    if (Bop->isAdditiveOp() || Bop->isMultiplicativeOp()) {<br class="gmail_msg">
       StringRef Op = Bop->getOpcodeStr();<br class="gmail_msg">
       S.Diag(Bop->getOperatorLoc(), diag::warn_addition_in_bitshift)<br class="gmail_msg">
           << Bop->getSourceRange() << OpLoc << Shift << Op;<br class="gmail_msg">
@@ -11313,8 +11313,8 @@<br class="gmail_msg">
   if ((Opc == BO_Shl && LHSExpr->getType()->isIntegralType(Self.getASTContext()))<br class="gmail_msg">
       || Opc == BO_Shr) {<br class="gmail_msg">
     StringRef Shift = BinaryOperator::getOpcodeStr(Opc);<br class="gmail_msg">
-    DiagnoseAdditionInShift(Self, OpLoc, LHSExpr, Shift);<br class="gmail_msg">
-    DiagnoseAdditionInShift(Self, OpLoc, RHSExpr, Shift);<br class="gmail_msg">
+    DiagnoseAddOrMulInShift(Self, OpLoc, LHSExpr, Shift);<br class="gmail_msg">
+    DiagnoseAddOrMulInShift(Self, OpLoc, RHSExpr, Shift);<br class="gmail_msg">
   }<br class="gmail_msg">
<br class="gmail_msg">
   // Warn on overloaded shift operators and comparisons, such as:<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
</blockquote></div>