[clang] [clang][bytecode] Fix assignInteger() with allocated primtypes (PR #145302)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Jun 23 03:06:27 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Timm Baeder (tbaederr)
<details>
<summary>Changes</summary>
---
Full diff: https://github.com/llvm/llvm-project/pull/145302.diff
2 Files Affected:
- (modified) clang/lib/AST/ByteCode/InterpBuiltin.cpp (+17-6)
- (modified) clang/test/AST/ByteCode/builtin-functions.cpp (+14)
``````````diff
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
``````````
</details>
https://github.com/llvm/llvm-project/pull/145302
More information about the cfe-commits
mailing list