Author: Timm Baeder Date: 2026-01-23T13:04:39+01:00 New Revision: de8126d62a47a571b931e0f21aba0542e1d58e61
URL: https://github.com/llvm/llvm-project/commit/de8126d62a47a571b931e0f21aba0542e1d58e61 DIFF: https://github.com/llvm/llvm-project/commit/de8126d62a47a571b931e0f21aba0542e1d58e61.diff LOG: [clang][bytecode] Fix mulc/divc op for IntegralAP types (#177565) We need to allocate those. Fixes https://github.com/llvm/llvm-project/issues/176740 Added: Modified: clang/lib/AST/ByteCode/Interp.h clang/test/AST/ByteCode/c.c Removed: ################################################################################ diff --git a/clang/lib/AST/ByteCode/Interp.h b/clang/lib/AST/ByteCode/Interp.h index b7de06f9a673e..cc8844e0fe90c 100644 --- a/clang/lib/AST/ByteCode/Interp.h +++ b/clang/lib/AST/ByteCode/Interp.h @@ -409,11 +409,19 @@ inline bool Mulc(InterpState &S, CodePtr OpPC) { // real(Result) = (real(LHS) * real(RHS)) - (imag(LHS) * imag(RHS)) T A; + if constexpr (needsAlloc<T>()) + A = S.allocAP<T>(Bits); if (T::mul(LHSR, RHSR, Bits, &A)) return false; + T B; + if constexpr (needsAlloc<T>()) + B = S.allocAP<T>(Bits); if (T::mul(LHSI, RHSI, Bits, &B)) return false; + + if constexpr (needsAlloc<T>()) + Result.elem<T>(0) = S.allocAP<T>(Bits); if (T::sub(A, B, Bits, &Result.elem<T>(0))) return false; @@ -422,6 +430,9 @@ inline bool Mulc(InterpState &S, CodePtr OpPC) { return false; if (T::mul(LHSI, RHSR, Bits, &B)) return false; + + if constexpr (needsAlloc<T>()) + Result.elem<T>(1) = S.allocAP<T>(Bits); if (T::add(A, B, Bits, &Result.elem<T>(1))) return false; Result.initialize(); @@ -475,10 +486,18 @@ inline bool Divc(InterpState &S, CodePtr OpPC) { // Den = real(RHS)² + imag(RHS)² T A, B; + if constexpr (needsAlloc<T>()) { + A = S.allocAP<T>(Bits); + B = S.allocAP<T>(Bits); + } + if (T::mul(RHSR, RHSR, Bits, &A) || T::mul(RHSI, RHSI, Bits, &B)) { // Ignore overflow here, because that's what the current interpeter does. } T Den; + if constexpr (needsAlloc<T>()) + Den = S.allocAP<T>(Bits); + if (T::add(A, B, Bits, &Den)) return false; @@ -491,7 +510,10 @@ inline bool Divc(InterpState &S, CodePtr OpPC) { // real(Result) = ((real(LHS) * real(RHS)) + (imag(LHS) * imag(RHS))) / Den T &ResultR = Result.elem<T>(0); T &ResultI = Result.elem<T>(1); - + if constexpr (needsAlloc<T>()) { + ResultR = S.allocAP<T>(Bits); + ResultI = S.allocAP<T>(Bits); + } if (T::mul(LHSR, RHSR, Bits, &A) || T::mul(LHSI, RHSI, Bits, &B)) return false; if (T::add(A, B, Bits, &ResultR)) diff --git a/clang/test/AST/ByteCode/c.c b/clang/test/AST/ByteCode/c.c index 67a47fdcc9523..7b98aa84a482c 100644 --- a/clang/test/AST/ByteCode/c.c +++ b/clang/test/AST/ByteCode/c.c @@ -417,3 +417,11 @@ void callReturnsComplex(void) { _Complex double c; c = returnsComplex(0.); // all-warning {{passing arguments to 'returnsComplex' without a prototype is deprecated in all versions of C and is not supported in C23}} } + +int complexMul[2 * (22222222222wb + 2i) == 2]; // all-warning {{'_BitInt' suffix for literals is a C23 extension}} \ + // pedantic-warning {{imaginary constants are a C2y extension}} \ + // all-warning {{variable length array folded to constant array as an extension}} + +int complexDiv[2 / (22222222222wb + 2i) == 2]; // all-warning {{'_BitInt' suffix for literals is a C23 extension}} \ + // pedantic-warning {{imaginary constants are a C2y extension}} \ + // all-warning {{variable length array folded to constant array as an extension}} _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
