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.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@137820 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chandler Carruth 2011-08-17 08:38:11 +00:00
Родитель 9d8eb3b2a8
Коммит 50bf68fc96
2 изменённых файлов: 19 добавлений и 9 удалений

Просмотреть файл

@ -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) {

Просмотреть файл

@ -17,6 +17,8 @@ void test() {
x != 7; // expected-warning {{inequality comparison as an unused top-level statement}} \
// expected-note {{cast this comparison to void to silence this warning}} \
// expected-note {{use '|=' to turn this inequality comparison into an or-assignment}}
7 == x; // expected-warning {{equality comparison as an unused top-level statement}} \
// expected-note {{cast this comparison to void to silence this warning}}
p == p; // expected-warning {{equality comparison as an unused top-level statement}} \
// expected-note {{cast this comparison to void to silence this warning}} \
// expected-note {{use '=' to turn this equality comparison into an assignment}} \
@ -30,6 +32,8 @@ void test() {
a != b; // expected-warning {{inequality comparison as an unused top-level statement}} \
// expected-note {{cast this comparison to void to silence this warning}} \
// expected-note {{use '|=' to turn this inequality comparison into an or-assignment}}
A() == b; // expected-warning {{equality comparison as an unused top-level statement}} \
// expected-note {{cast this comparison to void to silence this warning}}
if (42) x == 7; // expected-warning {{equality comparison as an unused top-level statement}} \
// expected-note {{cast this comparison to void to silence this warning}} \
// expected-note {{use '=' to turn this equality comparison into an assignment}}