зеркало из https://github.com/microsoft/clang-1.git
Fix PR13704
- The increment needs to be signed value to preserve the original value when its data type is larger than 64-bit integer. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@162766 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
92daae0186
Коммит
36d5ceaab2
|
@ -1306,7 +1306,7 @@ ScalarExprEmitter::EmitScalarPrePostIncDec(const UnaryOperator *E, LValue LV,
|
|||
// Most common case by far: integer increment.
|
||||
} else if (type->isIntegerType()) {
|
||||
|
||||
llvm::Value *amt = llvm::ConstantInt::get(value->getType(), amount);
|
||||
llvm::Value *amt = llvm::ConstantInt::get(value->getType(), amount, true);
|
||||
|
||||
// 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.
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
// RUN: %clang_cc1 %s -emit-llvm -o - | FileCheck %s
|
||||
extern void foo(__int128);
|
||||
|
||||
void bar() {
|
||||
__int128 x = 2;
|
||||
x--;
|
||||
foo(x);
|
||||
// CHECK: add nsw i128 %0, -1
|
||||
}
|
Загрузка…
Ссылка в новой задаче