aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CGExpr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/CodeGen/CGExpr.cpp')
-rw-r--r--lib/CodeGen/CGExpr.cpp17
1 files changed, 8 insertions, 9 deletions
diff --git a/lib/CodeGen/CGExpr.cpp b/lib/CodeGen/CGExpr.cpp
index a676333f49..1af0d56b44 100644
--- a/lib/CodeGen/CGExpr.cpp
+++ b/lib/CodeGen/CGExpr.cpp
@@ -2090,16 +2090,15 @@ EmitPointerToDataMemberBinaryExpr(const BinaryOperator *E) {
BaseV = EmitScalarExpr(E->getLHS());
else
BaseV = EmitLValue(E->getLHS()).getAddress();
- const llvm::Type *i8Ty = llvm::Type::getInt8PtrTy(getLLVMContext());
- BaseV = Builder.CreateBitCast(BaseV, i8Ty);
+
llvm::Value *OffsetV = EmitScalarExpr(E->getRHS());
- llvm::Value *AddV = Builder.CreateInBoundsGEP(BaseV, OffsetV, "add.ptr");
- QualType Ty = E->getRHS()->getType();
- Ty = Ty->getAs<MemberPointerType>()->getPointeeType();
-
- const llvm::Type *PType = ConvertType(getContext().getPointerType(Ty));
- AddV = Builder.CreateBitCast(AddV, PType);
- return MakeAddrLValue(AddV, Ty);
+ const MemberPointerType *MPT
+ = E->getRHS()->getType()->getAs<MemberPointerType>();
+
+ llvm::Value *AddV =
+ CGM.getCXXABI().EmitMemberDataPointerAddress(*this, BaseV, OffsetV, MPT);
+
+ return MakeAddrLValue(AddV, MPT->getPointeeType());
}