forked from OSchip/llvm-project
add a simple check to warn people who type "=+" when they probably meant
"+=". llvm-svn: 55131
This commit is contained in:
parent
c6337ac069
commit
ea71438a93
|
@ -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)")
|
||||
|
|
|
@ -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"))
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue