Explicitly check for casts to double or complex types instead of possibly asserting in SValuator.

llvm-svn: 95128
This commit is contained in:
Ted Kremenek 2010-02-02 21:11:40 +00:00
parent 47d7347858
commit 416b923786
2 changed files with 21 additions and 0 deletions

View File

@ -66,6 +66,12 @@ SValuator::CastResult SValuator::EvalCast(SVal val, const GRState *state,
if (C.hasSameUnqualifiedType(castTy, originalTy)) if (C.hasSameUnqualifiedType(castTy, originalTy))
return CastResult(state, val); return CastResult(state, val);
// Check for casts to real or complex numbers. We don't handle these at all
// right now.
if (castTy->isFloatingType() || castTy->isAnyComplexType())
return CastResult(state, UnknownVal());
// Check for casts from integers to integers.
if (castTy->isIntegerType() && originalTy->isIntegerType()) if (castTy->isIntegerType() && originalTy->isIntegerType())
return CastResult(state, EvalCastNL(cast<NonLoc>(val), castTy)); return CastResult(state, EvalCastNL(cast<NonLoc>(val), castTy));

View File

@ -851,3 +851,18 @@ int rdar_7593875(int n) {
// Previously we got a false positive about 'v' being uninitialized. // Previously we got a false positive about 'v' being uninitialized.
return v; // no-warning return v; // no-warning
} }
//===----------------------------------------------------------------------===//
// Handle casts from symbolic regions (packaged as integers) to doubles.
// Previously this caused an assertion failure.
//===----------------------------------------------------------------------===//
void *foo_rev95119();
void baz_rev95119(double x);
void bar_rev95119() {
// foo_rev95119() returns a symbolic pointer. It is then
// cast to an int which is then cast to a double.
int value = (int) foo_rev95119();
baz_rev95119((double)value);
}