summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaStmt.cpp
diff options
context:
space:
mode:
authorChandler Carruth <chandlerc@gmail.com>2011-08-17 08:38:11 +0000
committerChandler Carruth <chandlerc@gmail.com>2011-08-17 08:38:11 +0000
commite89ca5f7d2e856d9c489dfba0003130784c18ac8 (patch)
tree92e3f855408d56f870fbf0f8363213abf88ad623 /clang/lib/Sema/SemaStmt.cpp
parentae51ecc57b345839425afc5a0979459a8100e5d9 (diff)
downloadbcm5719-llvm-e89ca5f7d2e856d9c489dfba0003130784c18ac8.tar.gz
bcm5719-llvm-e89ca5f7d2e856d9c489dfba0003130784c18ac8.zip
Don't suggest assignment in implausible situation. We still warn, as the
code is very likely to be buggy, but its going to require more significant changes on the part of the user to correct it in this case. llvm-svn: 137820
Diffstat (limited to 'clang/lib/Sema/SemaStmt.cpp')
-rw-r--r--clang/lib/Sema/SemaStmt.cpp24
1 files changed, 15 insertions, 9 deletions
diff --git a/clang/lib/Sema/SemaStmt.cpp b/clang/lib/Sema/SemaStmt.cpp
index 79ae67210f2..79e317bb8ca 100644
--- a/clang/lib/Sema/SemaStmt.cpp
+++ b/clang/lib/Sema/SemaStmt.cpp
@@ -147,21 +147,23 @@ static void DiagnoseTopLevelComparison(Sema &S, const Stmt *Statement) {
}
SourceLocation Loc;
- bool IsNotEqual = false;
+ bool IsNotEqual, CanAssign;
if (const BinaryOperator *Op = dyn_cast<BinaryOperator>(E)) {
if (Op->getOpcode() != BO_EQ && Op->getOpcode() != BO_NE)
return;
- IsNotEqual = Op->getOpcode() == BO_NE;
Loc = Op->getOperatorLoc();
+ IsNotEqual = Op->getOpcode() == BO_NE;
+ CanAssign = Op->getLHS()->IgnoreParenImpCasts()->isLValue();
} else if (const CXXOperatorCallExpr *Op = dyn_cast<CXXOperatorCallExpr>(E)) {
if (Op->getOperator() != OO_EqualEqual &&
Op->getOperator() != OO_ExclaimEqual)
return;
- IsNotEqual = Op->getOperator() == OO_ExclaimEqual;
Loc = Op->getOperatorLoc();
+ IsNotEqual = Op->getOperator() == OO_ExclaimEqual;
+ CanAssign = Op->getArg(0)->IgnoreParenImpCasts()->isLValue();
} else {
// Not a typo-prone comparison.
return;
@@ -181,12 +183,16 @@ static void DiagnoseTopLevelComparison(Sema &S, const Stmt *Statement) {
<< FixItHint::CreateInsertion(Open, "(void)(")
<< FixItHint::CreateInsertion(Close, ")");
- if (IsNotEqual)
- S.Diag(Loc, diag::note_inequality_comparison_to_or_assign)
- << FixItHint::CreateReplacement(Loc, "|=");
- else
- S.Diag(Loc, diag::note_equality_comparison_to_assign)
- << FixItHint::CreateReplacement(Loc, "=");
+ // If the LHS is a plausible entity to assign to, provide a fixit hint to
+ // correct common typos.
+ if (CanAssign) {
+ if (IsNotEqual)
+ S.Diag(Loc, diag::note_inequality_comparison_to_or_assign)
+ << FixItHint::CreateReplacement(Loc, "|=");
+ else
+ S.Diag(Loc, diag::note_equality_comparison_to_assign)
+ << FixItHint::CreateReplacement(Loc, "=");
+ }
}
void Sema::DiagnoseUnusedExprResult(const Stmt *S) {
OpenPOWER on IntegriCloud