From: Ted Kremenek Date: Fri, 20 Mar 2009 18:35:45 +0000 (+0000) Subject: Fix by not warning about self-comparisons of enum X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b82dcd827495592a8748692ce4bf80402f21b8d4;p=clang Fix by not warning about self-comparisons of enum constants. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67390 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index c06f1cfad7..705fe4dfee 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -3276,11 +3276,15 @@ QualType Sema::CheckCompareOperands(Expr *&lex, Expr *&rex, SourceLocation Loc, // 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. + // NOTE: Per , don't warn about comparisons of enum + // constants. These can arise from macro expansions, and are usually quite + // deliberate. Expr *LHSStripped = lex->IgnoreParens(); Expr *RHSStripped = rex->IgnoreParens(); if (DeclRefExpr* DRL = dyn_cast(LHSStripped)) if (DeclRefExpr* DRR = dyn_cast(RHSStripped)) - if (DRL->getDecl() == DRR->getDecl()) + if (DRL->getDecl() == DRR->getDecl() && + !isa(DRL->getDecl())) Diag(Loc, diag::warn_selfcomparison); if (isa(LHSStripped)) diff --git a/test/Sema/self-comparison.c b/test/Sema/self-comparison.c index 023afb7926..8bf54fde9f 100644 --- a/test/Sema/self-comparison.c +++ b/test/Sema/self-comparison.c @@ -23,3 +23,11 @@ int bar(float x) { int bar2(float x) { return x != x; // no-warning } + +// Motivated by , self-comparisons of enum constants +// should not be warned about. These can be expanded from macros, and thus +// are usually deliberate. +int compare_enum() { + enum { A }; + return A == A; // no-warning +}