Fix <rdar://problem/6703892> 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 c06f1cf..705fe4d 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -3276,11 +3276,15 @@
// 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 <rdar://problem/6703892>, 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<DeclRefExpr>(LHSStripped))
if (DeclRefExpr* DRR = dyn_cast<DeclRefExpr>(RHSStripped))
- if (DRL->getDecl() == DRR->getDecl())
+ if (DRL->getDecl() == DRR->getDecl() &&
+ !isa<EnumConstantDecl>(DRL->getDecl()))
Diag(Loc, diag::warn_selfcomparison);
if (isa<CastExpr>(LHSStripped))