Don't diagnose overflow in case statements when the conversion is a

signed<->unsigned conversion with the same bit width. Fixes
<rdar://problem/7658121>.

llvm-svn: 96545
This commit is contained in:
Douglas Gregor 2010-02-18 00:56:01 +00:00
parent 4956ea0a51
commit e5ad57a3ed
2 changed files with 17 additions and 3 deletions

View File

@ -340,11 +340,11 @@ void Sema::ConvertIntegerToTypeWarnOnOverflow(llvm::APSInt &Val,
} else if (NewSign != Val.isSigned()) {
// Convert the sign to match the sign of the condition. This can cause
// overflow as well: unsigned(INTMIN)
// We don't diagnose this overflow, because it is implementation-defined
// behavior.
// FIXME: Introduce a second, default-ignored warning for this case?
llvm::APSInt OldVal(Val);
Val.setIsSigned(NewSign);
if (Val.isNegative()) // Sign bit changes meaning.
Diag(Loc, DiagID) << OldVal.toString(10) << Val.toString(10);
}
}

View File

@ -240,3 +240,17 @@ int test13(my_type_t t) {
}
return -1;
}
// <rdar://problem/7658121>
enum {
EC0 = 0xFFFF0000,
EC1 = 0xFFFF0001,
};
int test14(int a) {
switch(a) {
case EC0: return 0;
case EC1: return 1;
}
return 0;
}