Define and use a helper method to call a type conversion
function. llvm-svn: 83027
This commit is contained in:
parent
9df3d6d448
commit
78cfcb56a1
|
@ -2179,6 +2179,8 @@ public:
|
|||
Expr *BuildObjCEncodeExpression(SourceLocation AtLoc,
|
||||
QualType EncodedType,
|
||||
SourceLocation RParenLoc);
|
||||
CXXMemberCallExpr *BuildCXXMemberCallExpr(Expr *Exp, CXXMethodDecl *Method);
|
||||
|
||||
virtual ExprResult ParseObjCEncodeExpression(SourceLocation AtLoc,
|
||||
SourceLocation EncodeLoc,
|
||||
SourceLocation LParenLoc,
|
||||
|
|
|
@ -2080,6 +2080,24 @@ Sema::ActOnConversionOperatorReferenceExpr(Scope *S, ExprArg Base,
|
|||
ConvName, DeclPtrTy(), SS);
|
||||
}
|
||||
|
||||
CXXMemberCallExpr *Sema::BuildCXXMemberCallExpr(Expr *Exp,
|
||||
CXXMethodDecl *Method) {
|
||||
MemberExpr *ME =
|
||||
new (Context) MemberExpr(Exp, /*IsArrow=*/false, Method,
|
||||
SourceLocation(), Method->getType());
|
||||
QualType ResultType;
|
||||
if (const CXXConversionDecl *Conv = dyn_cast<CXXConversionDecl>(Method))
|
||||
ResultType = Conv->getConversionType().getNonReferenceType();
|
||||
else
|
||||
ResultType = Method->getResultType().getNonReferenceType();
|
||||
|
||||
CXXMemberCallExpr *CE =
|
||||
new (Context) CXXMemberCallExpr(Context, ME, 0, 0,
|
||||
ResultType,
|
||||
SourceLocation());
|
||||
return CE;
|
||||
}
|
||||
|
||||
Sema::OwningExprResult Sema::BuildCXXCastArgument(SourceLocation CastLoc,
|
||||
QualType Ty,
|
||||
CastExpr::CastKind Kind,
|
||||
|
@ -2108,22 +2126,10 @@ Sema::OwningExprResult Sema::BuildCXXCastArgument(SourceLocation CastLoc,
|
|||
if (PerformObjectArgumentInitialization(From, Method))
|
||||
return ExprError();
|
||||
|
||||
// Create an implicit member expr to refer to the conversion operator.
|
||||
MemberExpr *ME =
|
||||
new (Context) MemberExpr(From, /*IsArrow=*/false, Method,
|
||||
SourceLocation(), Method->getType());
|
||||
|
||||
|
||||
// And an implicit call expr that calls it.
|
||||
QualType ResultType = Method->getResultType().getNonReferenceType();
|
||||
CXXMemberCallExpr *CE =
|
||||
new (Context) CXXMemberCallExpr(Context, ME, 0, 0,
|
||||
ResultType,
|
||||
SourceLocation());
|
||||
|
||||
// Create an implicit call expr that calls it.
|
||||
CXXMemberCallExpr *CE = BuildCXXMemberCallExpr(From, Method);
|
||||
return Owned(CE);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -4895,15 +4895,10 @@ Sema::BuildCallToObjectOfClassType(Scope *S, Expr *Object,
|
|||
// on the object argument, then let ActOnCallExpr finish the job.
|
||||
|
||||
// Create an implicit member expr to refer to the conversion operator.
|
||||
MemberExpr *ME =
|
||||
new (Context) MemberExpr(Object, /*IsArrow=*/false, Conv,
|
||||
SourceLocation(), Conv->getType());
|
||||
QualType ResultType = Conv->getConversionType().getNonReferenceType();
|
||||
// and then call it.
|
||||
CXXMemberCallExpr *CE =
|
||||
new (Context) CXXMemberCallExpr(Context, ME, 0, 0,
|
||||
ResultType,
|
||||
SourceLocation());
|
||||
|
||||
BuildCXXMemberCallExpr(Object, Conv);
|
||||
|
||||
return ActOnCallExpr(S, ExprArg(*this, CE), LParenLoc,
|
||||
MultiExprArg(*this, (ExprTy**)Args, NumArgs),
|
||||
CommaLocs, RParenLoc).release();
|
||||
|
|
Loading…
Reference in New Issue