Index: clang/lib/Sema/SemaExpr.cpp =================================================================== --- clang/lib/Sema/SemaExpr.cpp +++ clang/lib/Sema/SemaExpr.cpp @@ -2711,6 +2711,15 @@ FromRecordType = FromType; DestType = DestRecordType; } + + LangAS FromAS = FromRecordType.getAddressSpace(); + LangAS DestAS = DestRecordType.getAddressSpace(); + if (FromAS != DestAS) { + auto FromTyWithoutAS = Context.removeAddrSpaceQualType(FromType); + auto DestASTy = Context.getAddrSpaceQualType(FromTyWithoutAS, DestAS); + From = ImpCastExprToType(From, DestASTy, CK_AddressSpaceConversion, + From->getValueKind()).get(); + } } else { // No conversion necessary. return From; Index: clang/test/CodeGenOpenCLCXX/addrspace-derived-base.cl =================================================================== --- clang/test/CodeGenOpenCLCXX/addrspace-derived-base.cl +++ 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,17 @@ 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 +}