[cfe-commits] r70562 - /cfe/trunk/lib/Sema/SemaOverload.cpp

Anders Carlsson andersca at mac.com
Fri May 1 11:34:55 PDT 2009


Author: andersca
Date: Fri May  1 13:34:30 2009
New Revision: 70562

URL: http://llvm.org/viewvc/llvm-project?rev=70562&view=rev
Log:
Get rid of the implicit deref call when calling member functions where the base is a pointer.

Modified:
    cfe/trunk/lib/Sema/SemaOverload.cpp

Modified: cfe/trunk/lib/Sema/SemaOverload.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOverload.cpp?rev=70562&r1=70561&r2=70562&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/SemaOverload.cpp (original)
+++ cfe/trunk/lib/Sema/SemaOverload.cpp Fri May  1 13:34:30 2009
@@ -1928,8 +1928,10 @@
 
   // 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 @@
 /// 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 @@
 
   // 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())) {





More information about the cfe-commits mailing list