@@ -689,10 +689,10 @@ class MicrosoftCXXABI : public CGCXXABI {
689689 llvm::Value *MemPtr,
690690 const MemberPointerType *MPT) override ;
691691
692- llvm::Value *
693- EmitMemberDataPointerAddress (CodeGenFunction &CGF, const Expr *E ,
694- Address Base, llvm::Value *MemPtr ,
695- const MemberPointerType *MPT ) override ;
692+ llvm::Value *EmitMemberDataPointerAddress (CodeGenFunction &CGF, const Expr *E,
693+ Address Base, llvm::Value *MemPtr ,
694+ const MemberPointerType *MPT ,
695+ bool IsInBounds ) override ;
696696
697697 llvm::Value *EmitNonNullMemberPointerConversion (
698698 const MemberPointerType *SrcTy, const MemberPointerType *DstTy,
@@ -3240,7 +3240,7 @@ llvm::Value *MicrosoftCXXABI::AdjustVirtualBase(
32403240
32413241llvm::Value *MicrosoftCXXABI::EmitMemberDataPointerAddress (
32423242 CodeGenFunction &CGF, const Expr *E, Address Base, llvm::Value *MemPtr,
3243- const MemberPointerType *MPT) {
3243+ const MemberPointerType *MPT, bool IsInBounds ) {
32443244 assert (MPT->isMemberDataPointer ());
32453245 CGBuilderTy &Builder = CGF.Builder ;
32463246 const CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl ();
@@ -3269,9 +3269,10 @@ llvm::Value *MicrosoftCXXABI::EmitMemberDataPointerAddress(
32693269 Addr = Base.emitRawPointer (CGF);
32703270 }
32713271
3272- // Apply the offset, which we assume is non-null.
3273- return Builder.CreateInBoundsGEP (CGF.Int8Ty , Addr, FieldOffset,
3274- " memptr.offset" );
3272+ // Apply the offset.
3273+ return Builder.CreateGEP (CGF.Int8Ty , Addr, FieldOffset, " memptr.offset" ,
3274+ IsInBounds ? llvm::GEPNoWrapFlags::inBounds ()
3275+ : llvm::GEPNoWrapFlags::none ());
32753276}
32763277
32773278llvm::Value *
0 commit comments