Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions clang/lib/Sema/SemaSYCL.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7691,6 +7691,8 @@ void SYCLIntegrationHeader::emit(raw_ostream &O) {
OutputStableNameInChars(O, K.StableName);
O << "> {\n";
} else {
Policy.SuppressDefaultTemplateArgs = false;
Policy.EnforceDefaultTemplateArgs = true;
O << "template <> struct KernelInfo<";
SYCLKernelNameTypePrinter Printer(O, Policy);
Printer.Visit(K.NameType);
Expand Down
23 changes: 18 additions & 5 deletions clang/test/CodeGenSYCL/int_header_func_pointer_template_arg.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,32 +4,45 @@
#include "sycl.hpp"
// Test to ensure that the integration header properly prints class template specializations that contain
// function pointers to free function kernels as template arguments.
// Also check that the forward declarations for free function kernels appear first in the integration header.
// Check that the forward declarations for free function kernels appear first in the integration header.
// Also check that default template arguments are printed properly when printing the name of a lambda/functor
// kernel in KernelInfo struct.


// CHECK: Forward declarations of kernel and its argument types:
// CHECK: void bar();

// CHECK: Forward declarations of kernel and its argument types:
// CHECK: template <typename T> void foo(T);

// CHECK: template <> struct KernelInfo<::Kernel<&foo<int>>> {
// CHECK: template <> struct KernelInfo<::Kernel<&foo<int>, int>> {

// CHECK: template <> struct KernelInfo<::Kernel<&bar, int>> {

// CHECK: template <> struct KernelInfo<::Kernel<&bar>> {
// CHECK: template <> struct KernelInfo<::Kernel<&foo<int>, ::X<int, int>>> {

// CHECK: template <> struct KernelInfo<::Kernel<&foo<float>, ::X<float, float>>> {

template <typename T, typename = int>
struct X;

template<typename T>
[[__sycl_detail__::add_ir_attributes_function("sycl-single-task-kernel", 2)]]
void foo(T arg) {}


[[__sycl_detail__::add_ir_attributes_function("sycl-single-task-kernel", 2)]]
void bar() {}

template<auto *Func>
template<auto *Func, typename Arg = int>
struct Kernel;

void foo() {
using kernel_name1 = Kernel<&foo<int>>;
using kernel_name2 = Kernel<&bar>;
using kernel_name3 = Kernel<&foo<int>, X<int>>;
using kernel_name4 = Kernel<&foo<float>, X<float, float>>;
sycl::kernel_single_task<kernel_name1>([](){});
sycl::kernel_single_task<kernel_name2>([](){});
sycl::kernel_single_task<kernel_name3>([](){});
sycl::kernel_single_task<kernel_name4>([](){});
}
Loading