diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2019-06-25 01:45:26 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2019-06-25 01:45:26 +0000 |
commit | 7939ba08ab42922a00b7f1b7e4761c7f9cc51f0c (patch) | |
tree | dc56e20bcaa28f707ad3f87372eeefab7a8cd5a0 /clang/test/CodeGenCXX/cxx2a-left-shift.cpp | |
parent | 079924b0b7fe5ee62ec9b9e4346544d147c781eb (diff) | |
download | bcm5719-llvm-7939ba08ab42922a00b7f1b7e4761c7f9cc51f0c.tar.gz bcm5719-llvm-7939ba08ab42922a00b7f1b7e4761c7f9cc51f0c.zip |
[cxx2a] P1236R1: the validity of a left shift does not depend on the
value of the LHS operand.
llvm-svn: 364265
Diffstat (limited to 'clang/test/CodeGenCXX/cxx2a-left-shift.cpp')
-rw-r--r-- | clang/test/CodeGenCXX/cxx2a-left-shift.cpp | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/clang/test/CodeGenCXX/cxx2a-left-shift.cpp b/clang/test/CodeGenCXX/cxx2a-left-shift.cpp new file mode 100644 index 00000000000..4814cfb3238 --- /dev/null +++ b/clang/test/CodeGenCXX/cxx2a-left-shift.cpp @@ -0,0 +1,19 @@ +// RUN: %clang_cc1 -std=c++2a -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s --check-prefixes=CHECK,REGULAR +// RUN: %clang_cc1 -std=c++2a -fsanitize=shift-base,shift-exponent -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s --check-prefixes=CHECK,SANITIZED + +// CHECK-LABEL: @_Z12lsh_overflow +int lsh_overflow(int a, int b) { + // SANITIZED: %[[RHS_INBOUNDS:.*]] = icmp ule i32 %[[RHS:.*]], 31 + // SANITIZED-NEXT: br i1 %[[RHS_INBOUNDS]], label %[[VALID:.*]], label + + // SANITIZED: call void @__ubsan_handle_shift_out_of_bounds + + // No check for the LHS here. + // SANITIZED: [[VALID]]: + // SANITIZED-NEXT: shl i32 % + // SANITIZED-NEXT: ret i32 + + // Just ensure there's no nsw nuw flags here. + // REGULAR: shl i32 % + return a << b; +} |