aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2009-09-28 23:23:40 +0000
committerFariborz Jahanian <fjahanian@apple.com>2009-09-28 23:23:40 +0000
commitb74002395520cff5933e16e06ba3f470b627bfb2 (patch)
tree10d3025218f7a7ffc2ea15622cf13f8f1e3c0794
parent82ad87b872b4c75b5e47f5b3514cc7ab082150d6 (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.h2
-rw-r--r--lib/Sema/SemaExprCXX.cpp34
-rw-r--r--lib/Sema/SemaOverload.cpp11
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();