Don't warn about case-value conversions from a negative value to a

larger unsigned value, since this is implementation-defined
behavior. (We previously suppressed this warning when converting from
a signed value to an unsigned value of the same size).

llvm-svn: 97430
This commit is contained in:
Douglas Gregor 2010-03-01 01:04:55 +00:00
parent 560169d5c4
commit a070ffa7b8
2 changed files with 12 additions and 7 deletions

View File

@ -314,15 +314,13 @@ void Sema::ConvertIntegerToTypeWarnOnOverflow(llvm::APSInt &Val,
// Perform a conversion to the promoted condition type if needed.
if (NewWidth > Val.getBitWidth()) {
// If this is an extension, just do it.
llvm::APSInt OldVal(Val);
Val.extend(NewWidth);
// If the input was signed and negative and the output is unsigned,
// warn.
if (!NewSign && OldVal.isSigned() && OldVal.isNegative())
Diag(Loc, DiagID) << OldVal.toString(10) << Val.toString(10);
Val.setIsSigned(NewSign);
// If the input was signed and negative and the output is
// unsigned, don't bother to warn: this is implementation-defined
// behavior.
// FIXME: Introduce a second, default-ignored warning for this case?
} else if (NewWidth < Val.getBitWidth()) {
// If this is a truncation, check for overflow.
llvm::APSInt ConvVal(Val);

View File

@ -254,3 +254,10 @@ int test14(int a) {
}
return 0;
}
void f1(unsigned x) {
switch (x) {
case -1: break;
default: break;
}
}