From fbcb0ebb51f4b76abaa4a7b30be08c175f723369 Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Thu, 16 Sep 2010 00:03:01 +0000 Subject: [PATCH] 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 . git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@114044 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaExpr.cpp | 6 ++++-- test/Sema/self-comparison.c | 11 +++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index a99d118d2b..2031508470 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/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(LHSStripped)) { if (DeclRefExpr* DRR = dyn_cast(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- diff --git a/test/Sema/self-comparison.c b/test/Sema/self-comparison.c index c5c0611e7c..edb3a6a4c8 100644 --- a/test/Sema/self-comparison.c +++ b/test/Sema/self-comparison.c @@ -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. +#define R8435950_A i +#define R8435950_B i + +int R8435950(int i) { + if (R8435950_A == R8435950_B) // no-warning + return 0; + return 1; +} + -- 2.40.0