diff options
| author | Ted Kremenek <kremenek@apple.com> | 2010-09-16 00:03:01 +0000 |
|---|---|---|
| committer | Ted Kremenek <kremenek@apple.com> | 2010-09-16 00:03:01 +0000 |
| commit | 853734e55877a407009787cefa6c6537e04152a8 (patch) | |
| tree | 96eb97b950a601cce648864057b61142f8194b85 /clang/lib/Sema | |
| parent | 9855109b6590d2488fb767464ca0f4307e798d59 (diff) | |
| download | bcm5719-llvm-853734e55877a407009787cefa6c6537e04152a8.tar.gz bcm5719-llvm-853734e55877a407009787cefa6c6537e04152a8.zip | |
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
Diffstat (limited to 'clang/lib/Sema')
| -rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index a99d118d2bc..20315084703 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -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- |

