From b74002395520cff5933e16e06ba3f470b627bfb2 Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Mon, 28 Sep 2009 23:23:40 +0000 Subject: [PATCH] Define and use a helper method to call a type conversion function. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@83027 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/Sema.h | 2 ++ lib/Sema/SemaExprCXX.cpp | 34 ++++++++++++++++++++-------------- lib/Sema/SemaOverload.cpp | 11 +++-------- 3 files changed, 25 insertions(+), 22 deletions(-) diff --git a/lib/Sema/Sema.h b/lib/Sema/Sema.h index be5e551579..db2bde0d94 100644 --- a/lib/Sema/Sema.h +++ b/lib/Sema/Sema.h @@ -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, diff --git a/lib/Sema/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp index 1127970858..183bd8f4c9 100644 --- a/lib/Sema/SemaExprCXX.cpp +++ b/lib/Sema/SemaExprCXX.cpp @@ -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(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); } - } } diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp index 42f3511e57..1283ff4b5e 100644 --- a/lib/Sema/SemaOverload.cpp +++ b/lib/Sema/SemaOverload.cpp @@ -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(); -- 2.40.0