For self-comparison warning, check the source location of both the LHS and RHS to see if they

are expanded from macros (and if so, omit the warning).  Previously we were just looking at the
location of the binary expression.

Fixes <rdar://problem/8435950>.

llvm-svn: 114044
This commit is contained in:
Ted Kremenek 2010-09-16 00:03:01 +00:00
parent 9855109b65
commit 853734e558
2 changed files with 15 additions and 2 deletions

View File

@ -5437,7 +5437,9 @@ QualType Sema::CheckCompareOperands(Expr *&lex, Expr *&rex, SourceLocation Loc,
QualType rType = rex->getType();
if (!lType->hasFloatingRepresentation() &&
!(lType->isBlockPointerType() && isRelational)) {
!(lType->isBlockPointerType() && isRelational) &&
!lex->getLocStart().isMacroID() &&
!rex->getLocStart().isMacroID()) {
// For non-floating point types, check for self-comparisons of the form
// x == x, x != x, x < x, etc. These always evaluate to a constant, and
// often indicate logic errors in the program.
@ -5452,7 +5454,7 @@ QualType Sema::CheckCompareOperands(Expr *&lex, Expr *&rex, SourceLocation Loc,
Expr *RHSStripped = rex->IgnoreParens();
if (DeclRefExpr* DRL = dyn_cast<DeclRefExpr>(LHSStripped)) {
if (DeclRefExpr* DRR = dyn_cast<DeclRefExpr>(RHSStripped)) {
if (DRL->getDecl() == DRR->getDecl() && !Loc.isMacroID() &&
if (DRL->getDecl() == DRR->getDecl() &&
!IsWithinTemplateSpecialization(DRL->getDecl())) {
DiagRuntimeBehavior(Loc, PDiag(diag::warn_comparison_always)
<< 0 // self-

View File

@ -75,3 +75,14 @@ int array_comparisons() {
}
// Don't issue a warning when either the left or right side of the comparison
// results from a macro expansion. <rdar://problem/8435950>
#define R8435950_A i
#define R8435950_B i
int R8435950(int i) {
if (R8435950_A == R8435950_B) // no-warning
return 0;
return 1;
}