// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --check-globals --version 3
// RUN: %clang_cc1 -fsycl-is-device -disable-llvm-passes \
// RUN:  -triple spir64 -fexceptions -emit-llvm -fno-ident %s -o - | FileCheck %s

int foo();

// CHECK-LABEL: define linkonce_odr spir_func void @_Z3barv(
// CHECK-SAME: ) #[[ATTR2:[0-9]+]] !srcloc ![[MD1:[0-9]+]] {
// CHECK-NEXT:  entry:
// CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4
// CHECK-NEXT:    [[A_ASCAST:%.*]] = addrspacecast ptr [[A]] to ptr addrspace(4)
// CHECK-NEXT:    [[CALL:%.*]] = call spir_func noundef i32 @_Z3foov() #[[ATTR3:[0-9]+]]
// CHECK-NEXT:    store i32 [[CALL]], ptr addrspace(4) [[A_ASCAST]], align 4
// CHECK-NEXT:    ret void
//
void bar() {
  int a = foo();
}

// CHECK-LABEL: define linkonce_odr spir_func noundef i32 @_Z3foov(
// CHECK-SAME: ) #[[ATTR2]] !srcloc ![[MD2:[0-9]+]] {
// CHECK-NEXT:  entry:
// CHECK-NEXT:    [[RETVAL:%.*]] = alloca i32, align 4
// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr [[RETVAL]] to ptr addrspace(4)
// CHECK-NEXT:    ret i32 1
//
int foo() {
  return 1;
}

template <typename Name, typename Func>
__attribute__((sycl_kernel)) void kernel_single_task(const Func &kernelFunc) {
  kernelFunc();
}

int main() {
  kernel_single_task<class fake_kernel>([] { bar(); });
  return 0;
}
//.
// CHECK: attributes #0 = { convergent mustprogress noinline norecurse nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" "sycl-module-id"="{{.*}}function-attrs.cpp" "uniform-work-group-size"="true" }
// CHECK: attributes #1 = { alwaysinline convergent mustprogress norecurse nounwind "no-trapping-math"="true" "stack-protector-buffer-size"="8" }
// CHECK: attributes #2 = { convergent mustprogress noinline norecurse nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" }
// CHECK: attributes #3 = { convergent nounwind }
//.
// CHECK: !{{[0-9]+}} = !{i32 1, !"wchar_size", i32 4}
// CHECK: !{{[0-9]+}} = !{i32 1, i32 2}
// CHECK: !{{[0-9]+}} = !{i32 4, i32 100000}
// CHECK: !{{[0-9]+}} = !{i32 {{.*}}}
// CHECK: !{{[0-9]+}} = !{}
// CHECK: ![[MD1]] = !{i32 {{.*}}}
// CHECK: ![[MD2]] = !{i32 {{.*}}}
//.
