Don't assert when dealing with unsigned casts of lvalues. Fixes PR5961.

llvm-svn: 92866
This commit is contained in:
John McCall 2010-01-06 22:57:21 +00:00
parent a7cef4fab5
commit 7443052652
2 changed files with 19 additions and 6 deletions

View File

@ -1629,15 +1629,17 @@ IntRange GetValueRange(ASTContext &C, llvm::APSInt &value, unsigned MaxWidth) {
return IntRange(value.getActiveBits(), true);
}
IntRange GetValueRange(ASTContext &C, APValue &result,
IntRange GetValueRange(ASTContext &C, APValue &result, QualType Ty,
unsigned MaxWidth) {
if (result.isInt())
return GetValueRange(C, result.getInt(), MaxWidth);
if (result.isVector()) {
IntRange R = GetValueRange(C, result.getVectorElt(0), MaxWidth);
for (unsigned i = 1, e = result.getVectorLength(); i != e; ++i)
R = IntRange::join(R, GetValueRange(C, result.getVectorElt(i), MaxWidth));
IntRange R = GetValueRange(C, result.getVectorElt(0), Ty, MaxWidth);
for (unsigned i = 1, e = result.getVectorLength(); i != e; ++i) {
IntRange El = GetValueRange(C, result.getVectorElt(i), Ty, MaxWidth);
R = IntRange::join(R, El);
}
return R;
}
@ -1649,8 +1651,11 @@ IntRange GetValueRange(ASTContext &C, APValue &result,
// This can happen with lossless casts to intptr_t of "based" lvalues.
// Assume it might use arbitrary bits.
// FIXME: The only reason we need to pass the type in here is to get
// the sign right on this one case. It would be nice if APValue
// preserved this.
assert(result.isLValue());
return IntRange(MaxWidth, false);
return IntRange(MaxWidth, Ty->isUnsignedIntegerType());
}
/// Pseudo-evaluate the given integer expression, estimating the
@ -1663,7 +1668,7 @@ IntRange GetExprRange(ASTContext &C, Expr *E, unsigned MaxWidth) {
// Try a full evaluation first.
Expr::EvalResult result;
if (E->Evaluate(result, C))
return GetValueRange(C, result.Val, MaxWidth);
return GetValueRange(C, result.Val, E->getType(), MaxWidth);
// I think we only want to look through implicit casts here; if the
// user has an explicit widening cast, we should treat the value as

View File

@ -266,3 +266,11 @@ void test3() {
if ((x > y ? x : y) > z)
(void) 0;
}
// PR5961
extern char *ptr4;
void test4() {
long value;
if (value < (unsigned long) &ptr4) // expected-warning {{comparison of integers of different signs}}
return;
}