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?= <tbae...@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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits