Define and use a helper method to call a type conversion

function.

llvm-svn: 83027
This commit is contained in:
Fariborz Jahanian 2009-09-28 23:23:40 +00:00
parent 9df3d6d448
commit 78cfcb56a1
3 changed files with 25 additions and 22 deletions

View File

@ -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,

View File

@ -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);
}
}
}

View File

@ -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();