Skip to content

Commit

Permalink
[clang][Interp] Implement IntegralAP::{div, rem} (#72614)
Browse files Browse the repository at this point in the history
  • Loading branch information
tbaederr committed Jan 15, 2024
1 parent 08e4386 commit c3ced6a
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 4 deletions.
12 changes: 8 additions & 4 deletions clang/lib/AST/Interp/IntegralAP.h
Original file line number Diff line number Diff line change
Expand Up @@ -204,14 +204,18 @@ template <bool Signed> class IntegralAP final {
}

static bool rem(IntegralAP A, IntegralAP B, unsigned OpBits, IntegralAP *R) {
// FIXME: Implement.
assert(false);
if constexpr (Signed)
*R = IntegralAP(A.V.srem(B.V));
else
*R = IntegralAP(A.V.urem(B.V));
return false;
}

static bool div(IntegralAP A, IntegralAP B, unsigned OpBits, IntegralAP *R) {
// FIXME: Implement.
assert(false);
if constexpr (Signed)
*R = IntegralAP(A.V.sdiv(B.V));
else
*R = IntegralAP(A.V.udiv(B.V));
return false;
}

Expand Down
30 changes: 30 additions & 0 deletions clang/test/AST/Interp/intap.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@


using MaxBitInt = _BitInt(128);
#define INT_MIN (~__INT_MAX__)

constexpr _BitInt(2) A = 0;
constexpr _BitInt(2) B = A + 1;
Expand Down Expand Up @@ -44,6 +45,35 @@ static_assert(MulA * MulB == 50, ""); // ref-error {{not an integral constant ex
static_assert(MulA * 5 == 25, "");
static_assert(-1 * MulB == -7, "");


constexpr _BitInt(4) DivA = 2;
constexpr _BitInt(2) DivB = 1;
static_assert(DivA / DivB == 2, "");

constexpr _BitInt(4) DivC = DivA / 0; // ref-error {{must be initialized by a constant expression}} \
// ref-note {{division by zero}} \
// expected-error {{must be initialized by a constant expression}} \
// expected-note {{division by zero}}

constexpr _BitInt(7) RemA = 47;
constexpr _BitInt(6) RemB = 9;
static_assert(RemA % RemB == 2, "");
static_assert(RemA % 0 == 1, ""); // ref-error {{not an integral constant expression}} \
// ref-note {{division by zero}} \
// expected-error {{not an integral constant expression}} \
// expected-note {{division by zero}}

constexpr _BitInt(32) bottom = -1;
constexpr _BitInt(32) top = INT_MIN;
constexpr _BitInt(32) nope = top / bottom; // ref-error {{must be initialized by a constant expression}} \
// ref-note {{value 2147483648 is outside the range}} \
// expected-error {{must be initialized by a constant expression}} \
// expected-note {{value 2147483648 is outside the range}}
constexpr _BitInt(32) noooo = top % bottom; // ref-error {{must be initialized by a constant expression}} \
// ref-note {{value 2147483648 is outside the range}} \
// expected-error {{must be initialized by a constant expression}} \
// expected-note {{value 2147483648 is outside the range}}

namespace APCast {
constexpr _BitInt(10) A = 1;
constexpr _BitInt(11) B = A;
Expand Down

0 comments on commit c3ced6a

Please sign in to comment.