summaryrefslogtreecommitdiffstats
path: root/clang/Sema/SemaChecking.cpp
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2007-11-29 00:59:04 +0000
committerTed Kremenek <kremenek@apple.com>2007-11-29 00:59:04 +0000
commiteda40e273ee6c25ca2b22d2be9ca0ff3ebb943bd (patch)
treed6e8e77f7bb96d726b6fd37ed70536b6e743a320 /clang/Sema/SemaChecking.cpp
parent3a2c95040144211668e9b42101c6548acea4adaf (diff)
downloadbcm5719-llvm-eda40e273ee6c25ca2b22d2be9ca0ff3ebb943bd.tar.gz
bcm5719-llvm-eda40e273ee6c25ca2b22d2be9ca0ff3ebb943bd.zip
Enhanced implementation of -Wfloat-equal to check for comparisons against
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. llvm-svn: 44424
Diffstat (limited to 'clang/Sema/SemaChecking.cpp')
-rw-r--r--clang/Sema/SemaChecking.cpp18
1 files changed, 18 insertions, 0 deletions
diff --git a/clang/Sema/SemaChecking.cpp b/clang/Sema/SemaChecking.cpp
index cb22f03a31f..20f0b81b430 100644
--- a/clang/Sema/SemaChecking.cpp
+++ b/clang/Sema/SemaChecking.cpp
@@ -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))
OpenPOWER on IntegriCloud