forked from OSchip/llvm-project
Left shifts of negative values are defined if -fwrapv is set
This means we shouldn't emit ubsan detection code or warn. Fixes PR25552. llvm-svn: 278786
This commit is contained in:
parent
5a123c4e37
commit
5980232178
|
@ -2714,7 +2714,8 @@ Value *ScalarExprEmitter::EmitShl(const BinOpInfo &Ops) {
|
|||
RHS = Builder.CreateIntCast(RHS, Ops.LHS->getType(), false, "sh_prom");
|
||||
|
||||
bool SanitizeBase = CGF.SanOpts.has(SanitizerKind::ShiftBase) &&
|
||||
Ops.Ty->hasSignedIntegerRepresentation();
|
||||
Ops.Ty->hasSignedIntegerRepresentation() &&
|
||||
!CGF.getLangOpts().isSignedOverflowDefined();
|
||||
bool SanitizeExponent = CGF.SanOpts.has(SanitizerKind::ShiftExponent);
|
||||
// OpenCL 6.3j: shift values are effectively % word size of LHS.
|
||||
if (CGF.getLangOpts().OpenCL)
|
||||
|
|
|
@ -8670,7 +8670,7 @@ static void DiagnoseBadShiftValues(Sema& S, ExprResult &LHS, ExprResult &RHS,
|
|||
|
||||
// If LHS does not have a signed type and non-negative value
|
||||
// then, the behavior is undefined. Warn about it.
|
||||
if (Left.isNegative()) {
|
||||
if (Left.isNegative() && !S.getLangOpts().isSignedOverflowDefined()) {
|
||||
S.DiagRuntimeBehavior(Loc, LHS.get(),
|
||||
S.PDiag(diag::warn_shift_lhs_negative)
|
||||
<< LHS.get()->getSourceRange());
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
// RUN: %clang_cc1 -fsanitize=shift-base -emit-llvm %s -o - -triple x86_64-linux-gnu -fwrapv | FileCheck %s
|
||||
|
||||
// CHECK-LABEL: @lsh_overflow
|
||||
int lsh_overflow(int a, int b) {
|
||||
// CHECK-NOT: br
|
||||
// CHECK-NOT: call void @__ubsan_
|
||||
// CHECK-NOT: call void @llvm.trap
|
||||
|
||||
// CHECK: %[[RET:.*]] = shl i32
|
||||
// CHECK-NEXT: ret i32 %[[RET]]
|
||||
return a << b;
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
// RUN: %clang_cc1 -Wall -ffreestanding -fsyntax-only -fwrapv -verify %s
|
||||
|
||||
int test() {
|
||||
int i;
|
||||
i = -1 << 1; // no-warning
|
||||
return i;
|
||||
}
|
||||
|
||||
// expected-no-diagnostics
|
Loading…
Reference in New Issue