add a simple check to warn people who type "=+" when they probably meant

"+=".

llvm-svn: 55131
This commit is contained in:
Chris Lattner 2008-08-21 18:04:13 +00:00
parent c6337ac069
commit ea71438a93
3 changed files with 34 additions and 2 deletions

View File

@ -1045,6 +1045,9 @@ DIAG(err_union_as_base_class, ERROR,
DIAG(err_incomplete_base_class, ERROR,
"base class has incomplete type")
DIAG(warn_not_compound_assign, WARNING,
"use of unary operator that may be intended as compound assignment (%0=)")
// CHECK: printf format string errors
DIAG(warn_printf_not_string_constant, WARNING,
"format string is not a string literal (potentially insecure)")

View File

@ -1901,10 +1901,30 @@ inline QualType Sema::CheckAssignmentOperands( // C99 6.5.16.1
}
AssignConvertType ConvTy;
if (compoundType.isNull())
if (compoundType.isNull()) {
// Simple assignment "x = y".
ConvTy = CheckSingleAssignmentConstraints(lhsType, rex);
else
// If the RHS is a unary plus or minus, check to see if they = and + are
// right next to each other. If so, the user may have typo'd "x =+ 4"
// instead of "x += 4".
Expr *RHSCheck = rex;
if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(RHSCheck))
RHSCheck = ICE->getSubExpr();
if (UnaryOperator *UO = dyn_cast<UnaryOperator>(RHSCheck)) {
if ((UO->getOpcode() == UnaryOperator::Plus ||
UO->getOpcode() == UnaryOperator::Minus) &&
loc.isFileID() && UO->getOperatorLoc().isFileID() &&
// Only if the two operators are exactly adjacent.
loc.getFileLocWithOffset(1) == UO->getOperatorLoc())
Diag(loc, diag::warn_not_compound_assign,
UO->getOpcode() == UnaryOperator::Plus ? "+" : "-",
SourceRange(UO->getOperatorLoc(), UO->getOperatorLoc()));
}
} else {
// Compound assignment "x += y"
ConvTy = CheckCompoundAssignmentConstraints(lhsType, rhsType);
}
if (DiagnoseAssignmentResult(ConvTy, loc, lhsType, rhsType,
rex, "assigning"))

View File

@ -15,3 +15,12 @@ void test3() {
(__extension__ x) = 10;
}
// rdar://6162726
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;
}