diff options
author | Ted Kremenek <kremenek@apple.com> | 2009-03-20 18:35:45 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2009-03-20 18:35:45 +0000 |
commit | 9ffbe41a6c7aeefeb15119ae66fbb9d576d949a1 (patch) | |
tree | 762b793f65247d30e4d5eb704a753f2bebeea409 /clang | |
parent | 9f804934dfc3cfd58f1b256853702064206149f0 (diff) | |
download | bcm5719-llvm-9ffbe41a6c7aeefeb15119ae66fbb9d576d949a1.tar.gz bcm5719-llvm-9ffbe41a6c7aeefeb15119ae66fbb9d576d949a1.zip |
Fix <rdar://problem/6703892> by not warning about self-comparisons of enum
constants.
llvm-svn: 67390
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 6 | ||||
-rw-r--r-- | clang/test/Sema/self-comparison.c | 8 |
2 files changed, 13 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index c06f1cfad78..705fe4dfeef 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/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 <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)) diff --git a/clang/test/Sema/self-comparison.c b/clang/test/Sema/self-comparison.c index 023afb7926f..8bf54fde9f5 100644 --- a/clang/test/Sema/self-comparison.c +++ b/clang/test/Sema/self-comparison.c @@ -23,3 +23,11 @@ int bar(float x) { int bar2(float x) { return x != x; // no-warning } + +// Motivated by <rdar://problem/6703892>, 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 +} |