diff options
author | David Blaikie <dblaikie@gmail.com> | 2012-10-05 00:41:03 +0000 |
---|---|---|
committer | David Blaikie <dblaikie@gmail.com> | 2012-10-05 00:41:03 +0000 |
commit | 15f17cbbd81365baeb1d02f3a13ad9cc7b426cae (patch) | |
tree | abd08a5394a19acaa40a2ed4fde98d6df88a4494 /clang/lib | |
parent | 65e8419086ac33afb7e8e30c4cccd9feff818b49 (diff) | |
download | bcm5719-llvm-15f17cbbd81365baeb1d02f3a13ad9cc7b426cae.tar.gz bcm5719-llvm-15f17cbbd81365baeb1d02f3a13ad9cc7b426cae.zip |
Implement -Wshift-op-parentheses for: a << b + c
This appears to be consistent with GCC's implementation of the same warning
under -Wparentheses. Suppressing a << b + c for cases where 'a' is a user
defined type for compatibility with C++ stream IO. Otherwise suggest
parentheses around the addition or subtraction subexpression.
(this came up when MSVC was complaining (incorrectly, so far as I can tell)
about a perceived violation of this within the LLVM codebase, PR14001)
llvm-svn: 165283
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index bbae55b5980..d40818b83b0 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -8570,6 +8570,20 @@ static void DiagnoseBitwiseAndInBitwiseOr(Sema &S, SourceLocation OpLoc, } } +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->getOpcode() == BO_Add ? "+" : "-"; + S.Diag(Bop->getOperatorLoc(), diag::warn_addition_in_bitshift) + << Bop->getSourceRange() << OpLoc << op << shift; + SuggestParentheses(S, Bop->getOperatorLoc(), + S.PDiag(diag::note_addition_in_bitshift_silence) << op, + Bop->getSourceRange()); + } + } +} + /// DiagnoseBinOpPrecedence - Emit warnings for expressions with tricky /// precedence. static void DiagnoseBinOpPrecedence(Sema &Self, BinaryOperatorKind Opc, @@ -8591,6 +8605,13 @@ static void DiagnoseBinOpPrecedence(Sema &Self, BinaryOperatorKind Opc, DiagnoseLogicalAndInLogicalOrLHS(Self, OpLoc, LHSExpr, RHSExpr); DiagnoseLogicalAndInLogicalOrRHS(Self, OpLoc, LHSExpr, RHSExpr); } + + if ((Opc == BO_Shl && LHSExpr->getType()->isIntegralType(Self.getASTContext())) + || Opc == BO_Shr) { + StringRef shift = Opc == BO_Shl ? "<<" : ">>"; + DiagnoseAdditionInShift(Self, OpLoc, LHSExpr, shift); + DiagnoseAdditionInShift(Self, OpLoc, RHSExpr, shift); + } } // Binary Operators. 'Tok' is the token for the operator. |