https://github.com/tbaederr created https://github.com/llvm/llvm-project/pull/199978
None >From 5f6d9a0f84d8a0348c62764f5c3fa62e93236565 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= <[email protected]> Date: Wed, 27 May 2026 15:05:20 +0200 Subject: [PATCH] [clang][bytecode] Fix variadic operator calls with explicit this --- clang/lib/AST/ByteCode/Compiler.cpp | 6 ++++-- clang/lib/AST/ByteCode/Function.h | 4 ++++ clang/lib/AST/ByteCode/Interp.cpp | 3 ++- clang/test/AST/ByteCode/cxx23.cpp | 8 ++++++++ 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/clang/lib/AST/ByteCode/Compiler.cpp b/clang/lib/AST/ByteCode/Compiler.cpp index 1e58d91861ad5a..9e23384d2bdb8c 100644 --- a/clang/lib/AST/ByteCode/Compiler.cpp +++ b/clang/lib/AST/ByteCode/Compiler.cpp @@ -5843,7 +5843,8 @@ bool Compiler<Emitter>::VisitCallExpr(const CallExpr *E) { if (IsVirtual && !HasQualifier) { uint32_t VarArgSize = 0; unsigned NumParams = - Func->getNumWrittenParams() + isa<CXXOperatorCallExpr>(E); + Func->getNumWrittenParams() + + (isa<CXXOperatorCallExpr>(E) && Func->hasImplicitThisParam()); for (unsigned I = NumParams, N = E->getNumArgs(); I != N; ++I) VarArgSize += align(primSize(classify(E->getArg(I)).value_or(PT_Ptr))); @@ -5852,7 +5853,8 @@ bool Compiler<Emitter>::VisitCallExpr(const CallExpr *E) { } else if (Func->isVariadic()) { uint32_t VarArgSize = 0; unsigned NumParams = - Func->getNumWrittenParams() + isa<CXXOperatorCallExpr>(E); + Func->getNumWrittenParams() + + (isa<CXXOperatorCallExpr>(E) && Func->hasImplicitThisParam()); for (unsigned I = NumParams, N = E->getNumArgs(); I != N; ++I) VarArgSize += align(primSize(classify(E->getArg(I)).value_or(PT_Ptr))); if (!this->emitCallVar(Func, VarArgSize, E)) diff --git a/clang/lib/AST/ByteCode/Function.h b/clang/lib/AST/ByteCode/Function.h index 653eb171ba81c8..862b0b4a0d7466 100644 --- a/clang/lib/AST/ByteCode/Function.h +++ b/clang/lib/AST/ByteCode/Function.h @@ -254,6 +254,10 @@ class Function final { return false; } + bool hasImplicitThisParam() const { + return hasThisPointer() && !isThisPointerExplicit(); + } + private: /// Construct a function representing an actual function. Function(Program &P, FunctionDeclTy Source, unsigned ArgSize, diff --git a/clang/lib/AST/ByteCode/Interp.cpp b/clang/lib/AST/ByteCode/Interp.cpp index ed182ea899f61d..135eaee209e8d1 100644 --- a/clang/lib/AST/ByteCode/Interp.cpp +++ b/clang/lib/AST/ByteCode/Interp.cpp @@ -251,7 +251,8 @@ void cleanupAfterFunctionCall(InterpState &S, CodePtr OpPC, assert(NumArgs >= Func->getNumWrittenParams()); NumVarArgs = NumArgs - (Func->getNumWrittenParams() + - isa<CXXOperatorCallExpr>(CallSite)); + (isa<CXXOperatorCallExpr>(CallSite) && + Func->hasImplicitThisParam())); for (unsigned I = 0; I != NumVarArgs; ++I) { const Expr *A = Args[NumArgs - 1 - I]; popArg(S, A); diff --git a/clang/test/AST/ByteCode/cxx23.cpp b/clang/test/AST/ByteCode/cxx23.cpp index d109c13398ffa6..f4e30c0c31b342 100644 --- a/clang/test/AST/ByteCode/cxx23.cpp +++ b/clang/test/AST/ByteCode/cxx23.cpp @@ -620,3 +620,11 @@ namespace PointerIntInc { auto bar2 = foo(&p, false); } #endif + +namespace VariadicOperator { + struct S { + constexpr int operator()(this S, ...) { return 42; } // all20-error {{explicit object parameters are incompatible with C++ standards before C++2b}} + }; + constexpr S s; + static_assert(s() == 42); +} _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
