in the truncation case, make sure to propagate the sign correctly, this

fixes an assertion on:
void f (int z) { switch (z) { case ~0ULL: case -1: return; } }

testcase from Neil.

llvm-svn: 41343
This commit is contained in:
Chris Lattner 2007-08-23 22:08:35 +00:00
parent 8ddb23a6c5
commit 247ef955bc
1 changed files with 3 additions and 0 deletions

View File

@ -180,13 +180,16 @@ void Sema::ConvertIntegerToTypeWarnOnOverflow(llvm::APSInt &Val,
// If this is a truncation, check for overflow.
llvm::APSInt ConvVal(Val);
ConvVal.trunc(NewWidth);
ConvVal.setIsSigned(NewSign);
ConvVal.extend(Val.getBitWidth());
ConvVal.setIsSigned(Val.isSigned());
if (ConvVal != Val)
Diag(Loc, DiagID, Val.toString(), ConvVal.toString());
// Regardless of whether a diagnostic was emitted, really do the
// truncation.
Val.trunc(NewWidth);
Val.setIsSigned(NewSign);
} else if (NewSign != Val.isSigned()) {
// Convert the sign to match the sign of the condition. This can cause
// overflow as well: unsigned(INTMIN)