]> granicus.if.org Git - clang/commitdiff
Enhanced implementation of -Wfloat-equal to check for comparisons against
authorTed Kremenek <kremenek@apple.com>
Thu, 29 Nov 2007 00:59:04 +0000 (00:59 +0000)
committerTed Kremenek <kremenek@apple.com>
Thu, 29 Nov 2007 00:59:04 +0000 (00:59 +0000)
floating-point literals that are represented exactly by the APFloat in
FloatingLiteral. For such literals, we do not emit a warning since such checks are
often performed in real code to see if a variable has changed from its original
value. This heuristic clearly can lead to false negatives, but the hope is it will
significantly reduce false positives to help make the compiler flag more useful.

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

Sema/SemaChecking.cpp

index cb22f03a31fd22fbeaf4c4704f6c0731cc2bc1c9..20f0b81b43068d7da538d9c475921a45dabcc86f 100644 (file)
@@ -715,6 +715,24 @@ void Sema::CheckFloatComparison(SourceLocation loc, Expr* lex, Expr *rex) {
       if (DRL->getDecl() == DRR->getDecl())
         EmitWarning = false;
   
+  
+  // Special case: check for comparisons against literals that can be exactly
+  //  represented by APFloat.  In such cases, do not emit a warning.  This
+  //  is a heuristic: often comparison against such literals are used to
+  //  detect if a value in a variable has not changed.  This clearly can
+  //  lead to false negatives.
+  if (EmitWarning) {
+    if (FloatingLiteral* FLL = dyn_cast<FloatingLiteral>(LeftExprSansParen)) {
+      if (FLL->isExact())
+        EmitWarning = false;
+    }
+    else
+      if (FloatingLiteral* FLR = dyn_cast<FloatingLiteral>(RightExprSansParen)){
+        if (FLR->isExact())
+          EmitWarning = false;
+    }
+  }
+  
   // Check for comparisons with builtin types.
   if (EmitWarning)           
     if (CallExpr* CL = dyn_cast<CallExpr>(LeftExprSansParen))