[clang] [clang][bytecode] Fix assignInteger() with allocated primtypes (PR #145302)
Timm Baeder via cfe-commits
cfe-commits at lists.llvm.org
Mon Jun 23 03:05:42 PDT 2025
https://github.com/tbaederr created https://github.com/llvm/llvm-project/pull/145302
None
>From 33eadba2a8d300be67cab69540537589400f7b96 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbaeder at redhat.com>
Date: Mon, 23 Jun 2025 12:00:20 +0200
Subject: [PATCH] [clang][bytecode] Fix assignInteger() with allocated
primtypes
---
clang/lib/AST/ByteCode/InterpBuiltin.cpp | 23 ++++++++++++++-----
clang/test/AST/ByteCode/builtin-functions.cpp | 14 +++++++++++
2 files changed, 31 insertions(+), 6 deletions(-)
diff --git a/clang/lib/AST/ByteCode/InterpBuiltin.cpp b/clang/lib/AST/ByteCode/InterpBuiltin.cpp
index 5304bd77f2c06..ea96e21ea9447 100644
--- a/clang/lib/AST/ByteCode/InterpBuiltin.cpp
+++ b/clang/lib/AST/ByteCode/InterpBuiltin.cpp
@@ -96,10 +96,21 @@ static void pushInteger(InterpState &S, T Val, QualType QT) {
QT);
}
-static void assignInteger(const Pointer &Dest, PrimType ValueT,
+static void assignInteger(InterpState &S, const Pointer &Dest, PrimType ValueT,
const APSInt &Value) {
- INT_TYPE_SWITCH_NO_BOOL(
- ValueT, { Dest.deref<T>() = T::from(static_cast<T>(Value)); });
+
+ if (ValueT == PT_IntAPS) {
+ Dest.deref<IntegralAP<true>>() =
+ S.allocAP<IntegralAP<true>>(Value.getBitWidth());
+ Dest.deref<IntegralAP<true>>().copy(Value);
+ } else if (ValueT == PT_IntAP) {
+ Dest.deref<IntegralAP<false>>() =
+ S.allocAP<IntegralAP<false>>(Value.getBitWidth());
+ Dest.deref<IntegralAP<false>>().copy(Value);
+ } else {
+ INT_TYPE_SWITCH_NO_BOOL(
+ ValueT, { Dest.deref<T>() = T::from(static_cast<T>(Value)); });
+ }
}
static QualType getElemType(const Pointer &P) {
@@ -849,7 +860,7 @@ static bool interp__builtin_overflowop(InterpState &S, CodePtr OpPC,
}
// Write Result to ResultPtr and put Overflow on the stack.
- assignInteger(ResultPtr, ResultT, Result);
+ assignInteger(S, ResultPtr, ResultT, Result);
ResultPtr.initialize();
assert(Call->getDirectCallee()->getReturnType()->isBooleanType());
S.Stk.push<Boolean>(Overflow);
@@ -902,7 +913,7 @@ static bool interp__builtin_carryop(InterpState &S, CodePtr OpPC,
QualType CarryOutType = Call->getArg(3)->getType()->getPointeeType();
PrimType CarryOutT = *S.getContext().classify(CarryOutType);
- assignInteger(CarryOutPtr, CarryOutT, CarryOut);
+ assignInteger(S, CarryOutPtr, CarryOutT, CarryOut);
CarryOutPtr.initialize();
assert(Call->getType() == Call->getArg(0)->getType());
@@ -1414,7 +1425,7 @@ static bool interp__builtin_ia32_addcarry_subborrow(InterpState &S,
QualType CarryOutType = Call->getArg(3)->getType()->getPointeeType();
PrimType CarryOutT = *S.getContext().classify(CarryOutType);
- assignInteger(CarryOutPtr, CarryOutT, APSInt(Result, true));
+ assignInteger(S, CarryOutPtr, CarryOutT, APSInt(Result, true));
pushInteger(S, CarryOut, Call->getType());
diff --git a/clang/test/AST/ByteCode/builtin-functions.cpp b/clang/test/AST/ByteCode/builtin-functions.cpp
index 174c1ffa79a43..3b95a8ea48596 100644
--- a/clang/test/AST/ByteCode/builtin-functions.cpp
+++ b/clang/test/AST/ByteCode/builtin-functions.cpp
@@ -1739,4 +1739,18 @@ namespace WithinLifetime {
// both-warning {{expression result unused}}
}
}
+
+#ifdef __SIZEOF_INT128__
+namespace I128Mul {
+ constexpr int mul() {
+ __int128 A = 10;
+ __int128 B = 10;
+ __int128 R;
+ __builtin_mul_overflow(A, B, &R);
+ return 1;
+ }
+ static_assert(mul() == 1);
+}
+#endif
+
#endif
More information about the cfe-commits
mailing list