diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -2711,6 +2711,20 @@ 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; diff --git a/clang/test/CodeGenOpenCLCXX/addrspace-derived-base.cl b/clang/test/CodeGenOpenCLCXX/addrspace-derived-base.cl --- a/clang/test/CodeGenOpenCLCXX/addrspace-derived-base.cl +++ b/clang/test/CodeGenOpenCLCXX/addrspace-derived-base.cl @@ -28,6 +28,7 @@ class B2 { public: void baseMethod() const { } + int &getRef() { return bb; } int bb; }; @@ -46,7 +47,25 @@ 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 +}