Author: Timm Baeder Date: 2026-05-29T08:32:44+02:00 New Revision: 4c1bc59365360f7f24a5c82b8cebd2b52634879a
URL: https://github.com/llvm/llvm-project/commit/4c1bc59365360f7f24a5c82b8cebd2b52634879a DIFF: https://github.com/llvm/llvm-project/commit/4c1bc59365360f7f24a5c82b8cebd2b52634879a.diff LOG: [clang][bytecode] Fix variadic operator calls with explicit this (#199978) Added: Modified: clang/lib/AST/ByteCode/Compiler.cpp clang/lib/AST/ByteCode/Function.h clang/lib/AST/ByteCode/Interp.cpp clang/test/AST/ByteCode/cxx23.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/ByteCode/Compiler.cpp b/clang/lib/AST/ByteCode/Compiler.cpp index 51f82330f97ca..f339d9a41ac2e 100644 --- a/clang/lib/AST/ByteCode/Compiler.cpp +++ b/clang/lib/AST/ByteCode/Compiler.cpp @@ -5845,7 +5845,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))); @@ -5854,7 +5855,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 653eb171ba81c..862b0b4a0d746 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 eeb302bdde4d3..abeda62773dde 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 d109c13398ffa..f4e30c0c31b34 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
