Skip to content

Commit

Permalink
[OpenCL] Fix address space for base method call (PR43145)
Browse files Browse the repository at this point in the history
Clang was creating an UncheckedDerivedToBase ImplicitCastExpr that was
also casting between address spaces.  Insert an ImplicitCastExpr node
for doing the address space conversion.

Differential Revision: https://reviews.llvm.org/D69810
  • Loading branch information
svenvh committed Nov 21, 2019
1 parent 5cf5876 commit 35388dc
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 2 deletions.
14 changes: 14 additions & 0 deletions clang/lib/Sema/SemaExpr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2711,6 +2711,20 @@ Sema::PerformObjectMemberConversion(Expr *From,
FromRecordType = FromType;
DestType = DestRecordType;
}

LangAS FromAS = FromRecordType.getAddressSpace();
LangAS DestAS = DestRecordType.getAddressSpace();
if (FromAS != DestAS) {
QualType FromRecordTypeWithoutAS =
Context.removeAddrSpaceQualType(FromRecordType);
QualType FromTypeWithDestAS =
Context.getAddrSpaceQualType(FromRecordTypeWithoutAS, DestAS);
if (PointerConversions)
FromTypeWithDestAS = Context.getPointerType(FromTypeWithDestAS);
From = ImpCastExprToType(From, FromTypeWithDestAS,
CK_AddressSpaceConversion, From->getValueKind())
.get();
}
} else {
// No conversion necessary.
return From;
Expand Down
23 changes: 21 additions & 2 deletions clang/test/CodeGenOpenCLCXX/addrspace-derived-base.cl
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ void foo() {
class B2 {
public:
void baseMethod() const { }
int &getRef() { return bb; }
int bb;
};

Expand All @@ -46,7 +47,25 @@ void pr43145(const Derived *argDerived) {

void pr43145_2(B *argB) {
Derived *x = (Derived*)argB;
// CHECK-LABEL: @_Z9pr43145_2
// CHECK: bitcast %struct.B addrspace(4)* %0 to %class.Derived addrspace(4)*
}

// CHECK-LABEL: @_Z9pr43145_2
// CHECK: bitcast %struct.B addrspace(4)* %0 to %class.Derived addrspace(4)*
// Assigning to reference returned by base class method through derived class.

void pr43145_3(int n) {
Derived d;
d.getRef() = n;

// CHECK-LABEL: @_Z9pr43145_3
// CHECK: addrspacecast %class.Derived* %d to %class.Derived addrspace(4)*
// CHECK: bitcast i8 addrspace(4)* %add.ptr to %class.B2 addrspace(4)*
// CHECK: call {{.*}} @_ZNU3AS42B26getRefEv

private Derived *pd = &d;
pd->getRef() = n;

// CHECK: addrspacecast %class.Derived* %4 to %class.Derived addrspace(4)*
// CHECK: bitcast i8 addrspace(4)* %add.ptr1 to %class.B2 addrspace(4)*
// CHECK: call {{.*}} @_ZNU3AS42B26getRefEv
}

0 comments on commit 35388dc

Please sign in to comment.