[clang] [Clang][NFC] Remove CallExpr::CreateTemporary (PR #130919)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Mar 12 00:48:05 PDT 2025
https://github.com/cor3ntin updated https://github.com/llvm/llvm-project/pull/130919
>From b74b40763cc838cb328860774afa82aa8ff99408 Mon Sep 17 00:00:00 2001
From: Corentin Jabot <corentinjabot at gmail.com>
Date: Wed, 12 Mar 2025 08:34:46 +0100
Subject: [PATCH] [Clang][NFC] Remove CallExpr::CreateTemporary
`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
---
clang/include/clang/AST/Expr.h | 12 ------------
clang/lib/AST/Expr.cpp | 20 ++------------------
clang/lib/Sema/SemaOverload.cpp | 12 +++++-------
3 files changed, 7 insertions(+), 37 deletions(-)
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..b7f26ec1e86bf 100644
--- a/clang/lib/Sema/SemaOverload.cpp
+++ b/clang/lib/Sema/SemaOverload.cpp
@@ -8147,17 +8147,15 @@ 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);
More information about the cfe-commits
mailing list