From: Douglas Gregor Date: Thu, 2 Sep 2010 15:00:29 +0000 (+0000) Subject: Fix a crash involving pointer-to-data-members of boolean type. We were X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b61e2a328c5c2552b0bb3a8d3c4bc9389f34a321;p=clang Fix a crash involving pointer-to-data-members of boolean type. We were constructing an LLVM PointerType directly from the "bool"'s LLVM type (i1), which resulted in unfortunate pointer type i1*. The fix is to build the LLVM PointerType from the corresponding Clang PointerType, so that we get i8* in the case of a bool. John, please review. I also left a FIXME there because we seem to be dropping "volatile", which would be rather unfortunate. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@112819 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/ItaniumCXXABI.cpp b/lib/CodeGen/ItaniumCXXABI.cpp index a1a53ad5e0..85b52c6322 100644 --- a/lib/CodeGen/ItaniumCXXABI.cpp +++ b/lib/CodeGen/ItaniumCXXABI.cpp @@ -305,8 +305,13 @@ llvm::Value *ItaniumCXXABI::EmitMemberDataPointerAddress(CodeGenFunction &CGF, // Cast the address to the appropriate pointer type, adopting the // address space of the base pointer. - const llvm::Type *PType - = CGF.ConvertType(MPT->getPointeeType())->getPointerTo(AS); + // FIXME: We seem to be losing the "volatile" qualifier on the base pointer. + QualType PtrType = CGF.getContext().getPointerType(MPT->getPointeeType()); + Qualifiers Qs = MPT->getPointeeType().getQualifiers(); + if (AS) + Qs.addAddressSpace(AS); + PtrType = CGF.getContext().getQualifiedType(PtrType, Qs); + const llvm::Type *PType = CGF.ConvertType(PtrType); return Builder.CreateBitCast(Addr, PType); } diff --git a/test/CodeGenCXX/pointers-to-data-members.cpp b/test/CodeGenCXX/pointers-to-data-members.cpp index 60c1661e06..38c7d2815a 100644 --- a/test/CodeGenCXX/pointers-to-data-members.cpp +++ b/test/CodeGenCXX/pointers-to-data-members.cpp @@ -189,3 +189,17 @@ struct A { A a; } + +namespace BoolPtrToMember { + struct X { + bool member; + }; + + // CHECK: define i8* @_ZN15BoolPtrToMember1fERNS_1XEMS0_b + bool &f(X &x, bool X::*member) { + // CHECK: {{bitcast.* to i8\*}} + // CHECK-NEXT: getelementptr inbounds i8* + // CHECK-NEXT: ret i8* + return x.*member; + } +}