diff options
author | John McCall <rjmccall@apple.com> | 2010-01-06 22:57:21 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2010-01-06 22:57:21 +0000 |
commit | 744305265277e4e4952c409e9a285bcf6b7fbaa0 (patch) | |
tree | ae146e688d2da949b0fccca65b85df2c05080740 /clang/lib | |
parent | a7cef4fab53c13d477d50948cefb208086391c69 (diff) | |
download | bcm5719-llvm-744305265277e4e4952c409e9a285bcf6b7fbaa0.tar.gz bcm5719-llvm-744305265277e4e4952c409e9a285bcf6b7fbaa0.zip |
Don't assert when dealing with unsigned casts of lvalues. Fixes PR5961.
llvm-svn: 92866
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Sema/SemaChecking.cpp | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index 463a03801a4..7bb456e66be 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -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 |