From 65a38183f0719df97a6ce2bf6b7cc4b106e60ed9 Mon Sep 17 00:00:00 2001 From: Chandler Carruth Date: Mon, 12 Jul 2010 06:23:38 +0000 Subject: Fix another aspect of PR7047, macro expansions. Previously, this was hacked around by exempting enums from the check, but this doesn't handle a lot of cases. A better approach is to directly check if the operator comes from a macro expansion. I've removed a reference to the rdar that originally led to the enum suppression when removing it's overly contrived test case. Let me know if that number or a more reasilistic test case involving enums is still needed. llvm-svn: 108128 --- clang/lib/Sema/SemaExpr.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) (limited to 'clang/lib/Sema/SemaExpr.cpp') diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index b907675b965..57b4232294e 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -5319,17 +5319,18 @@ 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: Don't warn about comparisons of enum constants. These can arise - // from macro expansions, and are usually quite deliberate. Also don't - // warn about comparisons which are only self comparisons within - // a template specialization. The warnings should catch obvious cases in - // the definition of the template anyways. + // + // NOTE: Don't warn about comparison expressions resulting from macro + // expansion. Also don't warn about comparisons which are only self + // comparisons within a template specialization. The warnings should catch + // obvious cases in the definition of the template anyways. The idea is to + // warn when the typed comparison operator will always evaluate to the same + // result. 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() && - !isa(DRL->getDecl()) && + if (DRL->getDecl() == DRR->getDecl() && !Loc.isMacroID() && !IsWithinTemplateSpecialization(DRL->getDecl())) { DiagRuntimeBehavior(Loc, PDiag(diag::warn_comparison_always) << 0 // self- -- cgit v1.2.3