[PATCH] D140845: [clang][Interp] Fix left-/right-shifting more than sizeof(unsigned)
Timm Bäder via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Jan 25 22:07:42 PST 2023
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rG00e967f6c2d6: [clang][Interp] Fix left-/right-shifting more than sizeof(unsigned) (authored by tbaeder).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D140845/new/
https://reviews.llvm.org/D140845
Files:
clang/lib/AST/Interp/Integral.h
clang/lib/AST/Interp/Interp.h
clang/test/AST/Interp/shifts.cpp
Index: clang/test/AST/Interp/shifts.cpp
===================================================================
--- clang/test/AST/Interp/shifts.cpp
+++ clang/test/AST/Interp/shifts.cpp
@@ -143,4 +143,9 @@
constexpr char c2 = 1;
constexpr int i3 = c2 << (__CHAR_BIT__ + 1); // Not ill-formed
+
+ constexpr signed long int L = 1;
+ constexpr signed int R = 62;
+ constexpr decltype(L) M = L << R;
+ constexpr decltype(L) M2 = L >> R;
};
Index: clang/lib/AST/Interp/Interp.h
===================================================================
--- clang/lib/AST/Interp/Interp.h
+++ clang/lib/AST/Interp/Interp.h
@@ -1334,8 +1334,9 @@
if (!CheckShift<RT>(S, OpPC, RHS, Bits))
return false;
- unsigned URHS = static_cast<unsigned>(RHS);
- S.Stk.push<LT>(LT::from(static_cast<unsigned>(LHS) >> URHS, LHS.bitWidth()));
+ Integral<LT::bitWidth(), false> R;
+ Integral<LT::bitWidth(), false>::shiftRight(LHS.toUnsigned(), RHS, Bits, &R);
+ S.Stk.push<LT>(R);
return true;
}
@@ -1350,9 +1351,9 @@
if (!CheckShift<RT>(S, OpPC, RHS, Bits))
return false;
- unsigned URHS = static_cast<unsigned>(RHS);
- S.Stk.push<LT>(LT::from(static_cast<unsigned>(LHS) << URHS, LHS.bitWidth()));
-
+ Integral<LT::bitWidth(), false> R;
+ Integral<LT::bitWidth(), false>::shiftLeft(LHS.toUnsigned(), RHS, Bits, &R);
+ S.Stk.push<LT>(R);
return true;
}
Index: clang/lib/AST/Interp/Integral.h
===================================================================
--- clang/lib/AST/Interp/Integral.h
+++ clang/lib/AST/Interp/Integral.h
@@ -234,6 +234,18 @@
return false;
}
+ template <unsigned RHSBits, bool RHSSign>
+ static void shiftLeft(const Integral A, const Integral<RHSBits, RHSSign> B,
+ unsigned OpBits, Integral *R) {
+ *R = Integral::from(A.V << B.V, OpBits);
+ }
+
+ template <unsigned RHSBits, bool RHSSign>
+ static void shiftRight(const Integral A, const Integral<RHSBits, RHSSign> B,
+ unsigned OpBits, Integral *R) {
+ *R = Integral::from(A.V >> B.V, OpBits);
+ }
+
private:
template <typename T> static bool CheckAddUB(T A, T B, T &R) {
if constexpr (std::is_signed_v<T>) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D140845.492326.patch
Type: text/x-patch
Size: 2187 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230126/4d138e83/attachment.bin>
More information about the cfe-commits
mailing list