aboutsummaryrefslogtreecommitdiff
path: root/lib/Sema/SemaOverload.cpp
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2009-05-01 18:34:30 +0000
committerAnders Carlsson <andersca@mac.com>2009-05-01 18:34:30 +0000
commita552f7c125d9f70eeb9e9793a2fabe99b806c983 (patch)
tree1c053180ebd03ed19e7fd1cbd1018a1212ee70e2 /lib/Sema/SemaOverload.cpp
parent98104728aa36ba6e5cebfa265ece57127091b906 (diff)
Get rid of the implicit deref call when calling member functions where the base is a pointer.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70562 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaOverload.cpp')
-rw-r--r--lib/Sema/SemaOverload.cpp34
1 files changed, 22 insertions, 12 deletions
diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp
index ab66939656..eb4c4e6706 100644
--- a/lib/Sema/SemaOverload.cpp
+++ b/lib/Sema/SemaOverload.cpp
@@ -1928,8 +1928,10 @@ Sema::TryObjectArgumentInitialization(Expr *From, CXXMethodDecl *Method) {
// We need to have an object of class type.
QualType FromType = From->getType();
- if (!FromType->isRecordType())
- return ICS;
+ if (const PointerType *PT = FromType->getAsPointerType())
+ FromType = PT->getPointeeType();
+
+ assert(FromType->isRecordType());
// The implicit object parmeter is has the type "reference to cv X",
// where X is the class of which the function is a member
@@ -1972,22 +1974,33 @@ Sema::TryObjectArgumentInitialization(Expr *From, CXXMethodDecl *Method) {
/// expression.
bool
Sema::PerformObjectArgumentInitialization(Expr *&From, CXXMethodDecl *Method) {
- QualType ImplicitParamType
- = Method->getThisType(Context)->getAsPointerType()->getPointeeType();
+ QualType FromRecordType, DestType;
+ QualType ImplicitParamRecordType =
+ Method->getThisType(Context)->getAsPointerType()->getPointeeType();
+
+ if (const PointerType *PT = From->getType()->getAsPointerType()) {
+ FromRecordType = PT->getPointeeType();
+ DestType = Method->getThisType(Context);
+ } else {
+ FromRecordType = From->getType();
+ DestType = ImplicitParamRecordType;
+ }
+
ImplicitConversionSequence ICS
= TryObjectArgumentInitialization(From, Method);
if (ICS.ConversionKind == ImplicitConversionSequence::BadConversion)
return Diag(From->getSourceRange().getBegin(),
diag::err_implicit_object_parameter_init)
- << ImplicitParamType << From->getType() << From->getSourceRange();
-
+ << ImplicitParamRecordType << FromRecordType << From->getSourceRange();
+
if (ICS.Standard.Second == ICK_Derived_To_Base &&
- CheckDerivedToBaseConversion(From->getType(), ImplicitParamType,
+ CheckDerivedToBaseConversion(FromRecordType,
+ ImplicitParamRecordType,
From->getSourceRange().getBegin(),
From->getSourceRange()))
return true;
- ImpCastExprToType(From, ImplicitParamType, /*isLvalue=*/true);
+ ImpCastExprToType(From, DestType, /*isLvalue=*/true);
return false;
}
@@ -4048,10 +4061,7 @@ Sema::BuildCallToMemberFunction(Scope *S, Expr *MemExprE,
// Extract the object argument.
Expr *ObjectArg = MemExpr->getBase();
- if (MemExpr->isArrow())
- ObjectArg = new (Context) UnaryOperator(ObjectArg, UnaryOperator::Deref,
- ObjectArg->getType()->getAsPointerType()->getPointeeType(),
- ObjectArg->getLocStart());
+
CXXMethodDecl *Method = 0;
if (OverloadedFunctionDecl *Ovl
= dyn_cast<OverloadedFunctionDecl>(MemExpr->getMemberDecl())) {