-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[Clang][NFC] Remove CallExpr::CreateTemporary #130919
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
@llvm/pr-subscribers-clang Author: cor3ntin (cor3ntin) Changes
We only need a type/value category for that, This simplify the code and avoid partially-formed Fixes #130824 Full diff: https://github.com/llvm/llvm-project/pull/130919.diff 3 Files Affected:
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);
|
✅ With the latest revision this PR passed the C/C++ code formatter. |
0219129
to
b74b407
Compare
Oops, I just filed #130921 (Code changes are almost the same, so I'll close my PR) |
@zyn0217 yeah, we basically did the same thing at the same time. Sorry! I don't care which gets merged |
Method && Method->isExplicitObjectMemberFunction()) | ||
return getArg(0)->getBeginLoc(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think we can revert that to
bool HasFirstArg = getNumArgs() > 0 && getArg(0);
assert(HasFirstArg);
if (HasFirstArg)
return getArg(0)->getBeginLoc();
so at least we have an assertion here. WDYT?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
getArg(0)
already has an assertion (and I don;t like having both an assertion and an if)
`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 llvm#130725) Fixes llvm#130824
b74b407
to
0e055b6
Compare
LLVM Buildbot has detected a new failure on builder Full details are available at: https://lab.llvm.org/buildbot/#/builders/73/builds/14437 Here is the relevant piece of the build log for the reference
|
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