summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2009-03-20 18:35:45 +0000
committerTed Kremenek <kremenek@apple.com>2009-03-20 18:35:45 +0000
commit9ffbe41a6c7aeefeb15119ae66fbb9d576d949a1 (patch)
tree762b793f65247d30e4d5eb704a753f2bebeea409 /clang
parent9f804934dfc3cfd58f1b256853702064206149f0 (diff)
downloadbcm5719-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.cpp6
-rw-r--r--clang/test/Sema/self-comparison.c8
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
+}
OpenPOWER on IntegriCloud