1*4eaf5846SElizabeth Andrews // RUN: %clang_cc1 -fsycl-is-device -emit-llvm -triple spir64 -verify -emit-llvm %s -o - | FileCheck %s
2*4eaf5846SElizabeth Andrews 
3*4eaf5846SElizabeth Andrews // expected-no-diagnostics
4*4eaf5846SElizabeth Andrews 
5*4eaf5846SElizabeth Andrews template <typename Name, typename Func>
6*4eaf5846SElizabeth Andrews __attribute__((sycl_kernel)) void kernel_single_task(const Func &kernelFunc) {
7*4eaf5846SElizabeth Andrews   kernelFunc();
8*4eaf5846SElizabeth Andrews }
9*4eaf5846SElizabeth Andrews 
10*4eaf5846SElizabeth Andrews // CHECK: define dso_local spir_func{{.*}}invoke_function{{.*}}(i32 ()* %fptr, i32 addrspace(4)* %ptr)
11*4eaf5846SElizabeth Andrews void invoke_function(int (*fptr)(), int *ptr) {}
12*4eaf5846SElizabeth Andrews 
13*4eaf5846SElizabeth Andrews int f() { return 0; }
14*4eaf5846SElizabeth Andrews 
15*4eaf5846SElizabeth Andrews int main() {
16*4eaf5846SElizabeth Andrews   kernel_single_task<class fake_kernel>([=]() {
17*4eaf5846SElizabeth Andrews     int (*p)() = f;
18*4eaf5846SElizabeth Andrews     int (&r)() = *p;
19*4eaf5846SElizabeth Andrews     int a = 10;
20*4eaf5846SElizabeth Andrews     invoke_function(p, &a);
21*4eaf5846SElizabeth Andrews     invoke_function(r, &a);
22*4eaf5846SElizabeth Andrews     invoke_function(f, &a);
23*4eaf5846SElizabeth Andrews   });
24*4eaf5846SElizabeth Andrews   return 0;
25*4eaf5846SElizabeth Andrews }
26