From: Ted Kremenek Date: Sat, 17 Jul 2010 00:40:32 +0000 (+0000) Subject: Fix APFloat assertion failure in IdempotentOperationChecker resulting in having X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=453293109e670824d84e94c0c2891737e3261f1f;p=clang Fix APFloat assertion failure in IdempotentOperationChecker resulting in having an APFloat with different "float semantics" than the compared float literal. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@108590 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Checker/IdempotentOperationChecker.cpp b/lib/Checker/IdempotentOperationChecker.cpp index 744fe2ba99..48b5a597ca 100644 --- a/lib/Checker/IdempotentOperationChecker.cpp +++ b/lib/Checker/IdempotentOperationChecker.cpp @@ -515,10 +515,12 @@ bool IdempotentOperationChecker::containsOneConstant(const Stmt *S) { if (IL && IL->getValue() == 1) return true; - const FloatingLiteral *FL = dyn_cast(S); - const llvm::APFloat one(1.0); - if (FL && FL->getValue().compare(one) == llvm::APFloat::cmpEqual) - return true; + if (const FloatingLiteral *FL = dyn_cast(S)) { + const llvm::APFloat &val = FL->getValue(); + const llvm::APFloat one(val.getSemantics(), 1); + if (val.compare(one) == llvm::APFloat::cmpEqual) + return true; + } for (Stmt::const_child_iterator I = S->child_begin(); I != S->child_end(); ++I) diff --git a/test/Analysis/idempotent-operations.c b/test/Analysis/idempotent-operations.c index 72adb8ef25..94e972c551 100644 --- a/test/Analysis/idempotent-operations.c +++ b/test/Analysis/idempotent-operations.c @@ -3,6 +3,7 @@ // Basic tests extern void test(int i); +extern void test_f(float f); void basic() { int x = 10, zero = 0, one = 1; @@ -50,3 +51,8 @@ void basic() { test(zero << x); // expected-warning {{idempotent operation; the left operand is always 0}} test(zero >> x); // expected-warning {{idempotent operation; the left operand is always 0}} } + +void floats(float x) { + test_f(x * 1.0); // no-warning + test_f(x * 1.0F); // no-warning +}