diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2009-09-28 23:23:40 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2009-09-28 23:23:40 +0000 |
commit | b74002395520cff5933e16e06ba3f470b627bfb2 (patch) | |
tree | 10d3025218f7a7ffc2ea15622cf13f8f1e3c0794 | |
parent | 82ad87b872b4c75b5e47f5b3514cc7ab082150d6 (diff) |
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
-rw-r--r-- | lib/Sema/Sema.h | 2 | ||||
-rw-r--r-- | lib/Sema/SemaExprCXX.cpp | 34 | ||||
-rw-r--r-- | 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<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); } - } } 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(); |