]> granicus.if.org Git - clang/commitdiff
For self-comparison warning, check the source location of both the LHS and RHS to...
authorTed Kremenek <kremenek@apple.com>
Thu, 16 Sep 2010 00:03:01 +0000 (00:03 +0000)
committerTed Kremenek <kremenek@apple.com>
Thu, 16 Sep 2010 00:03:01 +0000 (00:03 +0000)
are expanded from macros (and if so, omit the warning).  Previously we were just looking at the
location of the binary expression.

Fixes <rdar://problem/8435950>.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@114044 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaExpr.cpp
test/Sema/self-comparison.c

index a99d118d2bc585e67a98aeeb4c67369a82ba8110..20315084703932f2894a1e0a4d93db29eca0edeb 100644 (file)
@@ -5437,7 +5437,9 @@ QualType Sema::CheckCompareOperands(Expr *&lex, Expr *&rex, SourceLocation Loc,
   QualType rType = rex->getType();
 
   if (!lType->hasFloatingRepresentation() &&
-      !(lType->isBlockPointerType() && isRelational)) {
+      !(lType->isBlockPointerType() && isRelational) &&
+      !lex->getLocStart().isMacroID() &&
+      !rex->getLocStart().isMacroID()) {
     // 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.
@@ -5452,7 +5454,7 @@ QualType Sema::CheckCompareOperands(Expr *&lex, Expr *&rex, SourceLocation Loc,
     Expr *RHSStripped = rex->IgnoreParens();
     if (DeclRefExpr* DRL = dyn_cast<DeclRefExpr>(LHSStripped)) {
       if (DeclRefExpr* DRR = dyn_cast<DeclRefExpr>(RHSStripped)) {
-        if (DRL->getDecl() == DRR->getDecl() && !Loc.isMacroID() &&
+        if (DRL->getDecl() == DRR->getDecl() &&
             !IsWithinTemplateSpecialization(DRL->getDecl())) {
           DiagRuntimeBehavior(Loc, PDiag(diag::warn_comparison_always)
                               << 0 // self-
index c5c0611e7c94dc27d3744be06d26136e945ec618..edb3a6a4c8a5fa169155f3ad6601e8621dabb287 100644 (file)
@@ -75,3 +75,14 @@ int array_comparisons() {
 
 }
 
+// Don't issue a warning when either the left or right side of the comparison
+// results from a macro expansion.  <rdar://problem/8435950>
+#define R8435950_A i 
+#define R8435950_B i 
+
+int R8435950(int i) {
+  if (R8435950_A == R8435950_B) // no-warning
+   return 0;
+  return 1;
+}
+