[PATCH] D24861: [Sema] extend Wshift-op-parentheses so it warns for multiplicative operators
Daniel Marjamäki via cfe-commits
cfe-commits at lists.llvm.org
Wed Sep 28 04:07:02 PDT 2016
danielmarjamaki removed rL LLVM as the repository for this revision.
danielmarjamaki updated this revision to Diff 72797.
danielmarjamaki added a comment.
Don't write warning for multiplication in LHS of <<. Often the execution order is not important.
https://reviews.llvm.org/D24861
Files:
lib/Sema/SemaExpr.cpp
test/Sema/parentheses.cpp
Index: test/Sema/parentheses.cpp
===================================================================
--- test/Sema/parentheses.cpp
+++ test/Sema/parentheses.cpp
@@ -95,6 +95,23 @@
// CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:10-[[@LINE-2]]:10}:"("
// CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:15-[[@LINE-3]]:15}:")"
+ (void)(a >> b * c); // expected-warning {{operator '>>' has lower precedence than '*'; '*' will be evaluated first}} \
+ expected-note {{place parentheses around the '*' expression to silence this warning}}
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:15-[[@LINE-2]]:15}:"("
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:20-[[@LINE-3]]:20}:")"
+
+ (void)(a / b << c); // expected-warning {{operator '<<' has lower precedence than '/'; '/' will be evaluated first}} \
+ expected-note {{place parentheses around the '/' expression to silence this warning}}
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:10-[[@LINE-2]]:10}:"("
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:15-[[@LINE-3]]:15}:")"
+
+ (void)(a % b << c); // expected-warning {{operator '<<' has lower precedence than '%'; '%' will be evaluated first}} \
+ expected-note {{place parentheses around the '%' expression to silence this warning}}
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:10-[[@LINE-2]]:10}:"("
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:15-[[@LINE-3]]:15}:")"
+
+ (void)(a * b << c); // no warning, often the execution order does not matter.
+
Stream() << b + c;
Stream() >> b + c; // expected-warning {{operator '>>' has lower precedence than '+'; '+' will be evaluated first}} \
expected-note {{place parentheses around the '+' expression to silence this warning}}
Index: lib/Sema/SemaExpr.cpp
===================================================================
--- lib/Sema/SemaExpr.cpp
+++ lib/Sema/SemaExpr.cpp
@@ -11246,18 +11246,24 @@
}
}
-static void DiagnoseAdditionInShift(Sema &S, SourceLocation OpLoc,
- Expr *SubExpr, StringRef Shift) {
- if (BinaryOperator *Bop = dyn_cast<BinaryOperator>(SubExpr)) {
- if (Bop->getOpcode() == BO_Add || Bop->getOpcode() == BO_Sub) {
- StringRef Op = Bop->getOpcodeStr();
- S.Diag(Bop->getOperatorLoc(), diag::warn_addition_in_bitshift)
- << Bop->getSourceRange() << OpLoc << Shift << Op;
- SuggestParentheses(S, Bop->getOperatorLoc(),
- S.PDiag(diag::note_precedence_silence) << Op,
- Bop->getSourceRange());
- }
- }
+static void DiagnoseAddOrMulInShift(Sema &S, SourceLocation OpLoc,
+ Expr *SubExpr, StringRef Shift,
+ bool ShiftLeftLHS) {
+ BinaryOperator *Bop = dyn_cast<BinaryOperator>(SubExpr);
+ if (!Bop)
+ return;
+ if (!Bop->isAdditiveOp() && !Bop->isMultiplicativeOp())
+ return;
+ // In many cases, execution order does not matter for 'A*B<<C'.
+ if (ShiftLeftLHS && Bop->getOpcode() == BO_Mul)
+ return;
+
+ StringRef Op = Bop->getOpcodeStr();
+ S.Diag(Bop->getOperatorLoc(), diag::warn_addition_in_bitshift)
+ << Bop->getSourceRange() << OpLoc << Shift << Op;
+ SuggestParentheses(S, Bop->getOperatorLoc(),
+ S.PDiag(diag::note_precedence_silence) << Op,
+ Bop->getSourceRange());
}
static void DiagnoseShiftCompare(Sema &S, SourceLocation OpLoc,
@@ -11313,8 +11319,8 @@
if ((Opc == BO_Shl && LHSExpr->getType()->isIntegralType(Self.getASTContext()))
|| Opc == BO_Shr) {
StringRef Shift = BinaryOperator::getOpcodeStr(Opc);
- DiagnoseAdditionInShift(Self, OpLoc, LHSExpr, Shift);
- DiagnoseAdditionInShift(Self, OpLoc, RHSExpr, Shift);
+ DiagnoseAddOrMulInShift(Self, OpLoc, LHSExpr, Shift, Opc == BO_Shl);
+ DiagnoseAddOrMulInShift(Self, OpLoc, RHSExpr, Shift, false);
}
// Warn on overloaded shift operators and comparisons, such as:
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D24861.72797.patch
Type: text/x-patch
Size: 3940 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160928/6d80d2b8/attachment.bin>
More information about the cfe-commits
mailing list