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
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>) {
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;
}
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;
}
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;
};