зеркало из https://github.com/microsoft/clang-1.git
PR9350: increment/decrement of char (and anything else narrower than int)
can't overflow due to promotion rules; emit a wrapping add for those cases. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@126816 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
db04e2e26d
Коммит
fa0b409ef8
|
@ -1278,10 +1278,12 @@ ScalarExprEmitter::EmitScalarPrePostIncDec(const UnaryOperator *E, LValue LV,
|
|||
|
||||
llvm::Value *amt = llvm::ConstantInt::get(value->getType(), amount);
|
||||
|
||||
if (type->isSignedIntegerType())
|
||||
// Note that signed integer inc/dec with width less than int can't
|
||||
// overflow because of promotion rules; we're just eliding a few steps here.
|
||||
if (type->isSignedIntegerType() &&
|
||||
value->getType()->getPrimitiveSizeInBits() >=
|
||||
CGF.CGM.IntTy->getBitWidth())
|
||||
value = EmitAddConsiderOverflowBehavior(E, value, amt, isInc);
|
||||
|
||||
// Unsigned integer inc is always two's complement.
|
||||
else
|
||||
value = Builder.CreateAdd(value, amt, isInc ? "inc" : "dec");
|
||||
|
||||
|
|
|
@ -50,11 +50,17 @@ void test1() {
|
|||
// TRAPV_HANDLER: foo(
|
||||
--a;
|
||||
|
||||
|
||||
// -fwrapv should turn off inbounds for GEP's, PR9256
|
||||
extern int* P;
|
||||
++P;
|
||||
// DEFAULT: getelementptr inbounds i32*
|
||||
// WRAPV: getelementptr i32*
|
||||
// TRAPV: getelementptr inbounds i32*
|
||||
|
||||
// PR9350: char increment never overflows.
|
||||
extern volatile signed char PR9350;
|
||||
// DEFAULT: add i8 {{.*}}, 1
|
||||
// WRAPV: add i8 {{.*}}, 1
|
||||
// TRAPV: add i8 {{.*}}, 1
|
||||
++PR9350;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче