refine the "use of unary operator that may be intended as compound assignment (+=)"

warning to only trigger when there is whitespace or something else after the + as
suggested by Eli.

llvm-svn: 66370
This commit is contained in:
Chris Lattner 2009-03-08 06:51:10 +00:00
parent fbed86a865
commit 36c39c9b0a
2 changed files with 9 additions and 2 deletions

View File

@ -3479,10 +3479,14 @@ QualType Sema::CheckAssignmentOperands(Expr *LHS, Expr *&RHS,
UO->getOpcode() == UnaryOperator::Minus) &&
Loc.isFileID() && UO->getOperatorLoc().isFileID() &&
// Only if the two operators are exactly adjacent.
Loc.getFileLocWithOffset(1) == UO->getOperatorLoc())
Loc.getFileLocWithOffset(1) == UO->getOperatorLoc() &&
// And there is a space or other character before the subexpr of the
// unary +/-. We don't want to warn on "x=-1".
Loc.getFileLocWithOffset(2) != UO->getSubExpr()->getLocStart()) {
Diag(Loc, diag::warn_not_compound_assign)
<< (UO->getOpcode() == UnaryOperator::Plus ? "+" : "-")
<< SourceRange(UO->getOperatorLoc(), UO->getOperatorLoc());
}
}
} else {
// Compound assignment "x += y"

View File

@ -20,8 +20,11 @@ void test4() {
static int var;
var =+ 5; // expected-warning {{use of unary operator that may be intended as compound assignment (+=)}}
var =- 5; // expected-warning {{use of unary operator that may be intended as compound assignment (-=)}}
var = +5;
var = +5; // no warning when space between the = and +.
var = -5;
var =+5; // no warning when the subexpr of the unary op has no space before it.
var =-5;
}
// rdar://6319320