Index: clang/lib/CodeGen/CGCall.cpp =================================================================== --- clang/lib/CodeGen/CGCall.cpp +++ clang/lib/CodeGen/CGCall.cpp @@ -4085,8 +4085,13 @@ // If the argument doesn't match, perform a bitcast to coerce it. This // can happen due to trivial type mismatches. if (FirstIRArg < IRFuncTy->getNumParams() && - V->getType() != IRFuncTy->getParamType(FirstIRArg)) - V = Builder.CreateBitCast(V, IRFuncTy->getParamType(FirstIRArg)); + V->getType() != IRFuncTy->getParamType(FirstIRArg)) { + if (V->getType()->isPointerTy()) + V = Builder.CreatePointerBitCastOrAddrSpaceCast( + V, IRFuncTy->getParamType(FirstIRArg)); + else + V = Builder.CreateBitCast(V, IRFuncTy->getParamType(FirstIRArg)); + } IRCallArgs[FirstIRArg] = V; break; 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: bitcast + // CHECK: addrspacecast %class.B2* %2 to %class.B2 addrspace(4)* + // CHECK: call {{.*}} @_ZNU3AS42B26getRefEv +}