[clang][bytecode] Fix assignInteger() with allocated primtypes (#145302)

This commit is contained in:
Timm Baeder
2025-06-23 14:43:11 +02:00
committed by GitHub
parent 9881a507a2
commit 23ba0fdbfc
2 changed files with 31 additions and 6 deletions

View File

@@ -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());

View File

@@ -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