Author: Timm Bäder Date: 2023-01-26T07:49:10+01:00 New Revision: 136c7ef5d10fca0af101821b05084b428830e670
URL: https://github.com/llvm/llvm-project/commit/136c7ef5d10fca0af101821b05084b428830e670 DIFF: https://github.com/llvm/llvm-project/commit/136c7ef5d10fca0af101821b05084b428830e670.diff LOG: Revert "[clang][Interp] Fix left-/right-shifting more than sizeof(unsigned)" This reverts commit 00e967f6c2d626d1913f5af5763beab7946978ce. This breaks builders where long is only 32 bits, e.g. https://lab.llvm.org/buildbot/#/builders/65/builds/7721 https://lab.llvm.org/buildbot/#/builders/245/builds/3899 Added: Modified: clang/lib/AST/Interp/Integral.h clang/lib/AST/Interp/Interp.h clang/test/AST/Interp/shifts.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/Interp/Integral.h b/clang/lib/AST/Interp/Integral.h index 0eb0990a0334..d5368167d967 100644 --- a/clang/lib/AST/Interp/Integral.h +++ b/clang/lib/AST/Interp/Integral.h @@ -234,18 +234,6 @@ template <unsigned Bits, bool Signed> class Integral final { 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>) { diff --git a/clang/lib/AST/Interp/Interp.h b/clang/lib/AST/Interp/Interp.h index b36b513c067f..466df04ac08d 100644 --- a/clang/lib/AST/Interp/Interp.h +++ b/clang/lib/AST/Interp/Interp.h @@ -1334,9 +1334,8 @@ inline bool Shr(InterpState &S, CodePtr OpPC) { if (!CheckShift<RT>(S, OpPC, RHS, Bits)) return false; - Integral<LT::bitWidth(), false> R; - Integral<LT::bitWidth(), false>::shiftRight(LHS.toUnsigned(), RHS, Bits, &R); - S.Stk.push<LT>(R); + unsigned URHS = static_cast<unsigned>(RHS); + S.Stk.push<LT>(LT::from(static_cast<unsigned>(LHS) >> URHS, LHS.bitWidth())); return true; } @@ -1351,9 +1350,9 @@ inline bool Shl(InterpState &S, CodePtr OpPC) { if (!CheckShift<RT>(S, OpPC, RHS, Bits)) return false; - Integral<LT::bitWidth(), false> R; - Integral<LT::bitWidth(), false>::shiftLeft(LHS.toUnsigned(), RHS, Bits, &R); - S.Stk.push<LT>(R); + unsigned URHS = static_cast<unsigned>(RHS); + S.Stk.push<LT>(LT::from(static_cast<unsigned>(LHS) << URHS, LHS.bitWidth())); + return true; } diff --git a/clang/test/AST/Interp/shifts.cpp b/clang/test/AST/Interp/shifts.cpp index a9193258e6f5..8fa78beb9302 100644 --- a/clang/test/AST/Interp/shifts.cpp +++ b/clang/test/AST/Interp/shifts.cpp @@ -143,9 +143,4 @@ namespace shifts { 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; }; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits