Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 0 additions & 12 deletions clang/include/clang/AST/Expr.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
20 changes: 2 additions & 18 deletions clang/lib/AST/Expr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 =
Expand Down Expand Up @@ -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();
Comment on lines +1648 to +1649
Copy link
Contributor

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?

Copy link
Contributor Author

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)

}

SourceLocation begin = getCallee()->getBeginLoc();
Expand Down
11 changes: 4 additions & 7 deletions clang/lib/Sema/SemaOverload.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down