forked from OSchip/llvm-project
[PR40778] Preserve addr space in Derived to Base cast.
The address space for the Base class pointer when up-casting from Derived should be taken from the Derived class pointer. Differential Revision: https://reviews.llvm.org/D53818 llvm-svn: 355606
This commit is contained in:
parent
eb39991c8b
commit
9404955416
|
@ -302,7 +302,8 @@ Address CodeGenFunction::GetAddressOfBaseClass(
|
|||
|
||||
// Get the base pointer type.
|
||||
llvm::Type *BasePtrTy =
|
||||
ConvertType((PathEnd[-1])->getType())->getPointerTo();
|
||||
ConvertType((PathEnd[-1])->getType())
|
||||
->getPointerTo(Value.getType()->getPointerAddressSpace());
|
||||
|
||||
QualType DerivedTy = getContext().getRecordType(Derived);
|
||||
CharUnits DerivedAlign = CGM.getClassPointerAlignment(Derived);
|
||||
|
|
|
@ -2660,10 +2660,15 @@ Sema::PerformObjectMemberConversion(Expr *From,
|
|||
bool PointerConversions = false;
|
||||
if (isa<FieldDecl>(Member)) {
|
||||
DestRecordType = Context.getCanonicalType(Context.getTypeDeclType(RD));
|
||||
auto FromPtrType = FromType->getAs<PointerType>();
|
||||
DestRecordType = Context.getAddrSpaceQualType(
|
||||
DestRecordType, FromPtrType
|
||||
? FromType->getPointeeType().getAddressSpace()
|
||||
: FromType.getAddressSpace());
|
||||
|
||||
if (FromType->getAs<PointerType>()) {
|
||||
if (FromPtrType) {
|
||||
DestType = Context.getPointerType(DestRecordType);
|
||||
FromRecordType = FromType->getPointeeType();
|
||||
FromRecordType = FromPtrType->getPointeeType();
|
||||
PointerConversions = true;
|
||||
} else {
|
||||
DestType = DestRecordType;
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
// RUN: %clang_cc1 %s -triple spir -cl-std=c++ -emit-llvm -O0 -o - | FileCheck %s
|
||||
|
||||
struct B {
|
||||
int mb;
|
||||
};
|
||||
|
||||
class D : public B {
|
||||
public:
|
||||
int getmb() { return mb; }
|
||||
};
|
||||
|
||||
void foo() {
|
||||
D d;
|
||||
//CHECK: addrspacecast %class.D* %d to %class.D addrspace(4)*
|
||||
//CHECK: call i32 @_ZNU3AS41D5getmbEv(%class.D addrspace(4)*
|
||||
d.getmb();
|
||||
}
|
||||
|
||||
//Derived and Base are in the same address space.
|
||||
|
||||
//CHECK: define linkonce_odr i32 @_ZNU3AS41D5getmbEv(%class.D addrspace(4)* %this)
|
||||
//CHECK: bitcast %class.D addrspace(4)* %this1 to %struct.B addrspace(4)*
|
Loading…
Reference in New Issue