llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Timm Baeder (tbaederr) <details> <summary>Changes</summary> --- Full diff: https://github.com/llvm/llvm-project/pull/199978.diff 4 Files Affected: - (modified) clang/lib/AST/ByteCode/Compiler.cpp (+4-2) - (modified) clang/lib/AST/ByteCode/Function.h (+4) - (modified) clang/lib/AST/ByteCode/Interp.cpp (+2-1) - (modified) clang/test/AST/ByteCode/cxx23.cpp (+8) ``````````diff diff --git a/clang/lib/AST/ByteCode/Compiler.cpp b/clang/lib/AST/ByteCode/Compiler.cpp index 1e58d91861ad5..9e23384d2bdb8 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 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 ed182ea899f61..135eaee209e8d 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); +} `````````` </details> https://github.com/llvm/llvm-project/pull/199978 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
