[clang] 4cf996d - [clang][Interp] Implement IntegralAP::mul() (#72491)

via cfe-commits cfe-commits at lists.llvm.org
Thu Nov 16 06:06:15 PST 2023


Author: Timm Baeder
Date: 2023-11-16T15:06:11+01:00
New Revision: 4cf996d6a20d8fd0817c953fd383d261409e6d04

URL: https://github.com/llvm/llvm-project/commit/4cf996d6a20d8fd0817c953fd383d261409e6d04
DIFF: https://github.com/llvm/llvm-project/commit/4cf996d6a20d8fd0817c953fd383d261409e6d04.diff

LOG: [clang][Interp] Implement IntegralAP::mul() (#72491)

Added: 
    

Modified: 
    clang/lib/AST/Interp/IntegralAP.h
    clang/test/AST/Interp/intap.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/AST/Interp/IntegralAP.h b/clang/lib/AST/Interp/IntegralAP.h
index d85904a8f9572eb..bd665959cf3dcc4 100644
--- a/clang/lib/AST/Interp/IntegralAP.h
+++ b/clang/lib/AST/Interp/IntegralAP.h
@@ -191,17 +191,15 @@ template <bool Signed> class IntegralAP final {
   }
 
   static bool add(IntegralAP A, IntegralAP B, unsigned OpBits, IntegralAP *R) {
-    return CheckAddSubUB<std::plus>(A, B, OpBits, R);
+    return CheckAddSubMulUB<std::plus>(A, B, OpBits, R);
   }
 
   static bool sub(IntegralAP A, IntegralAP B, unsigned OpBits, IntegralAP *R) {
-    return CheckAddSubUB<std::minus>(A, B, OpBits, R);
+    return CheckAddSubMulUB<std::minus>(A, B, OpBits, R);
   }
 
   static bool mul(IntegralAP A, IntegralAP B, unsigned OpBits, IntegralAP *R) {
-    // FIXME: Implement.
-    assert(false);
-    return false;
+    return CheckAddSubMulUB<std::multiplies>(A, B, OpBits, R);
   }
 
   static bool rem(IntegralAP A, IntegralAP B, unsigned OpBits, IntegralAP *R) {
@@ -262,8 +260,8 @@ template <bool Signed> class IntegralAP final {
 
 private:
   template <template <typename T> class Op>
-  static bool CheckAddSubUB(const IntegralAP &A, const IntegralAP &B,
-                            unsigned BitWidth, IntegralAP *R) {
+  static bool CheckAddSubMulUB(const IntegralAP &A, const IntegralAP &B,
+                               unsigned BitWidth, IntegralAP *R) {
     if constexpr (!Signed) {
       R->V = Op<APInt>{}(A.V, B.V);
       return false;

diff  --git a/clang/test/AST/Interp/intap.cpp b/clang/test/AST/Interp/intap.cpp
index 4a18f1f9459e301..c93ec331296647b 100644
--- a/clang/test/AST/Interp/intap.cpp
+++ b/clang/test/AST/Interp/intap.cpp
@@ -35,6 +35,15 @@ static_assert(UBitIntZero1 == 0, "");
 constexpr unsigned _BitInt(2) BI1 = 3u;
 static_assert(BI1 == 3, "");
 
+constexpr _BitInt(4) MulA = 5;
+constexpr _BitInt(4) MulB = 7;
+static_assert(MulA * MulB == 50, ""); // ref-error {{not an integral constant expression}} \
+                                      // ref-note {{value 35 is outside the range of representable values of type '_BitInt(4)'}} \
+                                      // expected-error {{not an integral constant expression}} \
+                                      // expected-note {{value 35 is outside the range of representable values of type '_BitInt(4)'}}
+static_assert(MulA * 5 == 25, "");
+static_assert(-1 * MulB == -7, "");
+
 namespace APCast {
   constexpr _BitInt(10) A = 1;
   constexpr _BitInt(11) B = A;
@@ -66,6 +75,8 @@ namespace i128 {
                                        // ref-error {{static assertion failed}} \
                                        // ref-note {{'340282366920938463463374607431768211455 == 1'}}
 
+  constexpr uint128_t TooMuch = UINT128_MAX * 2;
+
   static const __int128_t INT128_MAX = UINT128_MAX >> (__int128_t)1;
   static_assert(INT128_MAX != 0, "");
   static_assert(INT128_MAX == 0, ""); // expected-error {{failed}} \
@@ -73,6 +84,11 @@ namespace i128 {
                                       // ref-error {{failed}} \
                                       // ref-note {{evaluates to '170141183460469231731687303715884105727 == 0'}}
 
+  constexpr int128_t TooMuch2 = INT128_MAX * INT128_MAX; // ref-error {{must be initialized by a constant expression}} \
+                                                // ref-note {{value 28948022309329048855892746252171976962977213799489202546401021394546514198529 is outside the range of representable}} \
+                                                // expected-error {{must be initialized by a constant expression}} \
+                                                // expected-note {{value 28948022309329048855892746252171976962977213799489202546401021394546514198529 is outside the range of representable}}
+
   static const __int128_t INT128_MIN = -INT128_MAX - 1;
   constexpr __int128 A = INT128_MAX + 1; // expected-error {{must be initialized by a constant expression}} \
                                          // expected-note {{value 170141183460469231731687303715884105728 is outside the range}} \


        


More information about the cfe-commits mailing list