Author: cor3ntin Date: 2025-03-12T09:49:24+01:00 New Revision: c9563a422cea44f0b00fdcd5085666442f8f24f8
URL: https://github.com/llvm/llvm-project/commit/c9563a422cea44f0b00fdcd5085666442f8f24f8 DIFF: https://github.com/llvm/llvm-project/commit/c9563a422cea44f0b00fdcd5085666442f8f24f8.diff LOG: [Clang][NFC] Remove CallExpr::CreateTemporary (#130919) `CallExpr::CreateTemporary` was only used to deduce a conversion sequence from a conversion operator. We only need a type/value category for that, so we can use a dummy Expression such as a `OpaqueValueExpr`. This simplify the code and avoid partially-formed `CallExpr` with incorrect invariants (see #130725) Fixes #130824 Added: Modified: clang/include/clang/AST/Expr.h clang/lib/AST/Expr.cpp clang/lib/Sema/SemaOverload.cpp Removed: ################################################################################ diff --git a/clang/include/clang/AST/Expr.h b/clang/include/clang/AST/Expr.h index cfe49acf20b77..b81f3a403baf6 100644 --- a/clang/include/clang/AST/Expr.h +++ b/clang/include/clang/AST/Expr.h @@ -3005,18 +3005,6 @@ class CallExpr : public Expr { FPOptionsOverride FPFeatures, unsigned MinNumArgs = 0, ADLCallKind UsesADL = NotADL); - /// Create a temporary call expression with no arguments in the memory - /// pointed to by Mem. Mem must points to at least sizeof(CallExpr) - /// + sizeof(Stmt *) bytes of storage, aligned to alignof(CallExpr): - /// - /// \code{.cpp} - /// alignas(CallExpr) char Buffer[sizeof(CallExpr) + sizeof(Stmt *)]; - /// CallExpr *TheCall = CallExpr::CreateTemporary(Buffer, etc); - /// \endcode - static CallExpr *CreateTemporary(void *Mem, Expr *Fn, QualType Ty, - ExprValueKind VK, SourceLocation RParenLoc, - ADLCallKind UsesADL = NotADL); - /// Create an empty call expression, for deserialization. static CallExpr *CreateEmpty(const ASTContext &Ctx, unsigned NumArgs, bool HasFPFeatures, EmptyShell Empty); diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index 1dde64f193dbd..901ebf9592680 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -1509,16 +1509,6 @@ CallExpr *CallExpr::Create(const ASTContext &Ctx, Expr *Fn, RParenLoc, FPFeatures, MinNumArgs, UsesADL); } -CallExpr *CallExpr::CreateTemporary(void *Mem, Expr *Fn, QualType Ty, - ExprValueKind VK, SourceLocation RParenLoc, - ADLCallKind UsesADL) { - assert(!(reinterpret_cast<uintptr_t>(Mem) % alignof(CallExpr)) && - "Misaligned memory in CallExpr::CreateTemporary!"); - return new (Mem) CallExpr(CallExprClass, Fn, /*PreArgs=*/{}, /*Args=*/{}, Ty, - VK, RParenLoc, FPOptionsOverride(), - /*MinNumArgs=*/0, UsesADL); -} - CallExpr *CallExpr::CreateEmpty(const ASTContext &Ctx, unsigned NumArgs, bool HasFPFeatures, EmptyShell Empty) { unsigned SizeOfTrailingObjects = @@ -1655,14 +1645,8 @@ SourceLocation CallExpr::getBeginLoc() const { if (!isTypeDependent()) { if (const auto *Method = dyn_cast_if_present<const CXXMethodDecl>(getCalleeDecl()); - Method && Method->isExplicitObjectMemberFunction()) { - // Note: while we typically expect the call to have a first argument - // here, we can't assert it because in some cases it does not, e.g. - // calls created with CallExpr::CreateTemporary() during overload - // resolution. - if (getNumArgs() > 0 && getArg(0)) - return getArg(0)->getBeginLoc(); - } + Method && Method->isExplicitObjectMemberFunction()) + return getArg(0)->getBeginLoc(); } SourceLocation begin = getCallee()->getBeginLoc(); diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index d3c0534b4dd0b..990f2659eb8fa 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -8147,17 +8147,14 @@ void Sema::AddConversionCandidate( ExprValueKind VK = Expr::getValueKindForType(ConversionType); - // Note that it is safe to allocate CallExpr on the stack here because - // there are 0 arguments (i.e., nothing is allocated using ASTContext's - // allocator). QualType CallResultType = ConversionType.getNonLValueExprType(Context); - alignas(CallExpr) char Buffer[sizeof(CallExpr) + sizeof(Stmt *)]; - CallExpr *TheTemporaryCall = CallExpr::CreateTemporary( - Buffer, &ConversionFn, CallResultType, VK, From->getBeginLoc()); + // Introduce a temporary expression with the right type and value category + // that we can use for deduction purposes. + OpaqueValueExpr FakeCall(From->getBeginLoc(), CallResultType, VK); ImplicitConversionSequence ICS = - TryCopyInitialization(*this, TheTemporaryCall, ToType, + TryCopyInitialization(*this, &FakeCall, ToType, /*SuppressUserConversions=*/true, /*InOverloadResolution=*/false, /*AllowObjCWritebackConversion=*/false); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits