Skip to content

Commit 2614d4d

Browse files
authored
[SYCL] Add a diagnostic on attempt to pass a command group function object to q.single_task() (#5064)
1 parent 00f43b3 commit 2614d4d

File tree

2 files changed

+72
-1
lines changed

2 files changed

+72
-1
lines changed

sycl/include/CL/sycl/queue.hpp

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -688,8 +688,14 @@ class __SYCL_EXPORT queue {
688688
/// \param CodeLoc contains the code location of user code
689689
template <typename KernelName = detail::auto_name, typename KernelType>
690690
event single_task(_KERNELFUNCPARAM(KernelFunc) _CODELOCPARAM(&CodeLoc)) {
691+
static_assert(
692+
(detail::check_fn_signature<detail::remove_reference_t<KernelType>,
693+
void()>::value ||
694+
detail::check_fn_signature<detail::remove_reference_t<KernelType>,
695+
void(kernel_handler)>::value),
696+
"sycl::queue.single_task() requires a kernel instead of command group. "
697+
"Use queue.submit() instead");
691698
_CODELOCARG(&CodeLoc);
692-
693699
return submit(
694700
[&](handler &CGH) {
695701
CGH.template single_task<KernelName, KernelType>(KernelFunc);
@@ -705,6 +711,13 @@ class __SYCL_EXPORT queue {
705711
template <typename KernelName = detail::auto_name, typename KernelType>
706712
event single_task(event DepEvent,
707713
_KERNELFUNCPARAM(KernelFunc) _CODELOCPARAM(&CodeLoc)) {
714+
static_assert(
715+
(detail::check_fn_signature<detail::remove_reference_t<KernelType>,
716+
void()>::value ||
717+
detail::check_fn_signature<detail::remove_reference_t<KernelType>,
718+
void(kernel_handler)>::value),
719+
"sycl::queue.single_task() requires a kernel instead of command group. "
720+
"Use queue.submit() instead");
708721
_CODELOCARG(&CodeLoc);
709722
return submit(
710723
[&](handler &CGH) {
@@ -723,6 +736,13 @@ class __SYCL_EXPORT queue {
723736
template <typename KernelName = detail::auto_name, typename KernelType>
724737
event single_task(const std::vector<event> &DepEvents,
725738
_KERNELFUNCPARAM(KernelFunc) _CODELOCPARAM(&CodeLoc)) {
739+
static_assert(
740+
(detail::check_fn_signature<detail::remove_reference_t<KernelType>,
741+
void()>::value ||
742+
detail::check_fn_signature<detail::remove_reference_t<KernelType>,
743+
void(kernel_handler)>::value),
744+
"sycl::queue.single_task() requires a kernel instead of command group. "
745+
"Use queue.submit() instead");
726746
_CODELOCARG(&CodeLoc);
727747
return submit(
728748
[&](handler &CGH) {
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
// RUN: %clangxx %fsycl-host-only -fsyntax-only -Xclang -verify -Xclang -verify-ignore-unexpected=note -o - %s
2+
#include <CL/sycl.hpp>
3+
#include <iostream>
4+
int main() {
5+
{
6+
int varA = 42;
7+
int varB = 42;
8+
int sum = 0;
9+
sycl::queue myQueue{};
10+
{
11+
myQueue
12+
.single_task([&](sycl::handler &cgh) {
13+
// expected-error-re@CL/sycl/queue.hpp:691 {{static_assert failed due to requirement '{{.*}}' "sycl::queue.single_task() requires a kernel instead of command group.{{.*}} Use queue.submit() instead"}}
14+
// expected-error-re@CL/sycl/detail/cg_types.hpp:191 {{no matching function for call to object of type '(lambda at {{.*}}single_task_error_message.cpp:{{.*}})'}}
15+
})
16+
.wait();
17+
}
18+
}
19+
{
20+
int varA = 42;
21+
int varB = 42;
22+
int sum = 0;
23+
sycl::queue myQueue{};
24+
{
25+
sycl::event e{};
26+
myQueue
27+
.single_task(e,
28+
[&](sycl::handler &cgh) {
29+
// expected-error-re@CL/sycl/queue.hpp:714 {{static_assert failed due to requirement '{{.*}}' "sycl::queue.single_task() requires a kernel instead of command group.{{.*}} Use queue.submit() instead"}}
30+
// expected-error-re@CL/sycl/detail/cg_types.hpp:191 {{no matching function for call to object of type '(lambda at {{.*}}single_task_error_message.cpp:{{.*}})'}}
31+
})
32+
.wait();
33+
}
34+
}
35+
{
36+
int varA = 42;
37+
int varB = 42;
38+
int sum = 0;
39+
sycl::queue myQueue{};
40+
{
41+
std::vector<sycl::event> vector_event;
42+
myQueue
43+
.single_task(vector_event,
44+
[&](sycl::handler &cgh) {
45+
// expected-error-re@CL/sycl/queue.hpp:739 {{static_assert failed due to requirement '{{.*}}' "sycl::queue.single_task() requires a kernel instead of command group.{{.*}} Use queue.submit() instead"}}
46+
// expected-error-re@CL/sycl/detail/cg_types.hpp:191 {{no matching function for call to object of type '(lambda at {{.*}}single_task_error_message.cpp:{{.*}})'}}
47+
})
48+
.wait();
49+
}
50+
}
51+
}

0 commit comments

Comments
 (0)