Index: clang/lib/CodeGen/CodeGenTypes.cpp =================================================================== --- clang/lib/CodeGen/CodeGenTypes.cpp +++ clang/lib/CodeGen/CodeGenTypes.cpp @@ -633,7 +633,9 @@ const ReferenceType *RTy = cast(Ty); QualType ETy = RTy->getPointeeType(); llvm::Type *PointeeType = ConvertTypeForMem(ETy); - unsigned AS = Context.getTargetAddressSpace(ETy); + unsigned AS = PointeeType->isFunctionTy() + ? getDataLayout().getProgramAddressSpace() + : Context.getTargetAddressSpace(ETy); ResultType = llvm::PointerType::get(PointeeType, AS); break; } Index: clang/test/CodeGenSYCL/functionptr-addressspace.cpp =================================================================== --- /dev/null +++ clang/test/CodeGenSYCL/functionptr-addressspace.cpp @@ -0,0 +1,25 @@ +// RUN: %clang_cc1 -fsycl-is-device -emit-llvm -triple spir64 -verify -emit-llvm %s -o - | FileCheck %s + +// expected-no-diagnostics + +template +__attribute__((sycl_kernel)) void kernel_single_task(const Func &kernelFunc) { + kernelFunc(); +} + +// CHECK: define dso_local spir_func{{.*}}invoke_function{{.*}}(i32 ()* %fptr, i32 addrspace(4)* %ptr) +void invoke_function(int (*fptr)(), int *ptr) {} + +int f() { return 0; } + +int main() { + kernel_single_task([=]() { + int (*p)() = f; + int (&r)() = *p; + int a = 10; + invoke_function(p, &a); + invoke_function(r, &a); + invoke_function(f, &a); + }); + return 0; +}