Complete code gen for '.*' binary expression for
both scalar and aggregates.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@84910 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CGExprScalar.cpp b/lib/CodeGen/CGExprScalar.cpp
index 831b480..69604f9 100644
--- a/lib/CodeGen/CGExprScalar.cpp
+++ b/lib/CodeGen/CGExprScalar.cpp
@@ -106,7 +106,6 @@
     return 0;
   }
   Value *VisitExpr(Expr *S);
-  Value *VisitPointerToDataMemberBinaryExpr(const BinaryOperator *BExpr);
   
   Value *VisitParenExpr(ParenExpr *PE) { return Visit(PE->getSubExpr()); }
 
@@ -539,8 +538,11 @@
 
 Value *ScalarExprEmitter::VisitExpr(Expr *E) {
   if (const BinaryOperator *BExpr = dyn_cast<BinaryOperator>(E))
-    if (BExpr->getOpcode() == BinaryOperator::PtrMemD)
-      return VisitPointerToDataMemberBinaryExpr(BExpr);
+    if (BExpr->getOpcode() == BinaryOperator::PtrMemD) {
+      LValue LV = CGF.EmitPointerToDataMemberBinaryExpr(BExpr);
+      Value *InVal = CGF.EmitLoadOfLValue(LV, E->getType()).getScalarVal();
+      return InVal;
+    }
   
   CGF.ErrorUnsupported(E, "scalar expression");
   if (E->getType()->isVoidType())
@@ -548,27 +550,6 @@
   return llvm::UndefValue::get(CGF.ConvertType(E->getType()));
 }
 
-Value *ScalarExprEmitter::VisitPointerToDataMemberBinaryExpr(
-                                                    const BinaryOperator *E) {
-  Value *BaseV = EmitLValue(E->getLHS()).getAddress();
-  const llvm::Type *i8Ty = llvm::Type::getInt8PtrTy(CGF.getLLVMContext());
-  BaseV = Builder.CreateBitCast(BaseV, i8Ty);
-  Value *OffsetV = EmitLoadOfLValue(E->getRHS());
-  const llvm::Type* ResultType = ConvertType(
-                                        CGF.getContext().getPointerDiffType());
-  OffsetV = Builder.CreateBitCast(OffsetV, ResultType);
-  Value *AddV = Builder.CreateInBoundsGEP(BaseV, OffsetV, "add.ptr");
-  QualType Ty = E->getRHS()->getType();
-  const MemberPointerType *MemPtrType = Ty->getAs<MemberPointerType>();
-  Ty = MemPtrType->getPointeeType();
-  const llvm::Type* PType = 
-  ConvertType(CGF.getContext().getPointerType(Ty));
-  AddV = Builder.CreateBitCast(AddV, PType);
-  LValue LV = LValue::MakeAddr(AddV, CGF.MakeQualifiers(Ty));
-  Value *InVal = CGF.EmitLoadOfLValue(LV, Ty).getScalarVal();
-  return InVal;
-}
-
 Value *ScalarExprEmitter::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
   llvm::SmallVector<llvm::Constant*, 32> indices;
   for (unsigned i = 2; i < E->getNumSubExprs(); i++) {