@@ -163,6 +163,8 @@ class pipe;
163163}
164164
165165namespace  ext  ::oneapi ::experimental {
166+ template  <typename , typename >
167+ class  work_group_memory ;
166168struct  image_descriptor ;
167169} //  namespace ext::oneapi::experimental
168170
@@ -171,6 +173,7 @@ class graph_impl;
171173} //  namespace ext::oneapi::experimental::detail
172174namespace  detail  {
173175
176+ class  work_group_memory_impl ;
174177class  handler_impl ;
175178class  kernel_impl ;
176179class  queue_impl ;
@@ -564,8 +567,8 @@ class __SYCL_EXPORT handler {
564567  //  The version for regular(standard layout) argument.
565568  template  <typename  T, typename ... Ts>
566569  void  setArgsHelper (int  ArgIndex, T &&Arg, Ts &&...Args) {
567-     set_arg (ArgIndex, std::move  (Arg));
568-     setArgsHelper (++ArgIndex, std::move  (Args)...);
570+     set_arg (ArgIndex, std::forward<T> (Arg));
571+     setArgsHelper (++ArgIndex, std::forward<Ts> (Args)...);
569572  }
570573
571574  void  setArgsHelper (int ) {}
@@ -603,6 +606,8 @@ class __SYCL_EXPORT handler {
603606#endif 
604607  }
605608
609+   void  setArgHelper (int  ArgIndex, detail::work_group_memory_impl &Arg);
610+ 
606611  //  setArgHelper for non local accessor argument.
607612  template  <typename  DataT, int  Dims, access::mode AccessMode,
608613            access::target AccessTarget, access::placeholder IsPlaceholder>
@@ -1096,7 +1101,7 @@ class __SYCL_EXPORT handler {
10961101                                KernelType KernelFunc) {
10971102#ifndef  __SYCL_DEVICE_ONLY__
10981103    throwIfActionIsCreated ();
1099-     throwOnLocalAccessorMisuse <KernelName, KernelType>();
1104+     throwOnKernelParameterMisuse <KernelName, KernelType>();
11001105    if  (!range_size_fits_in_size_t (UserRange))
11011106      throw  sycl::exception (make_error_code (errc::runtime),
11021107                            " The total number of work-items in " 
@@ -1641,7 +1646,7 @@ class __SYCL_EXPORT handler {
16411646    kernel_single_task_wrapper<NameT, KernelType, PropertiesT>(KernelFunc);
16421647#ifndef  __SYCL_DEVICE_ONLY__
16431648    throwIfActionIsCreated ();
1644-     throwOnLocalAccessorMisuse <KernelName, KernelType>();
1649+     throwOnKernelParameterMisuse <KernelName, KernelType>();
16451650    verifyUsedKernelBundleInternal (
16461651        detail::string_view{detail::getKernelName<NameT>()});
16471652    //  No need to check if range is out of INT_MAX limits as it's compile-time
@@ -1840,6 +1845,14 @@ class __SYCL_EXPORT handler {
18401845    setArgHelper (ArgIndex, std::move (Arg));
18411846  }
18421847
1848+   template  <typename  DataT, typename  PropertyListT =
1849+                                 ext::oneapi::experimental::empty_properties_t >
1850+   void  set_arg (
1851+       int  ArgIndex,
1852+       ext::oneapi::experimental::work_group_memory<DataT, PropertyListT> &Arg) {
1853+     setArgHelper (ArgIndex, Arg);
1854+   }
1855+ 
18431856  //  set_arg for graph dynamic_parameters
18441857  template  <typename  T>
18451858  void  set_arg (int  argIndex,
@@ -1858,9 +1871,8 @@ class __SYCL_EXPORT handler {
18581871  // /
18591872  // / \param Args are argument values to be set.
18601873  template  <typename ... Ts> void  set_args (Ts &&...Args) {
1861-     setArgsHelper (0 , std::move  (Args)...);
1874+     setArgsHelper (0 , std::forward<Ts> (Args)...);
18621875  }
1863- 
18641876  // / Defines and invokes a SYCL kernel function as a function object type.
18651877  // /
18661878  // / If it is a named function object and the function object type is
@@ -3233,7 +3245,6 @@ class __SYCL_EXPORT handler {
32333245private: 
32343246  std::shared_ptr<detail::handler_impl> impl;
32353247  std::shared_ptr<detail::queue_impl> MQueue;
3236- 
32373248  std::vector<detail::LocalAccessorImplPtr> MLocalAccStorage;
32383249  std::vector<std::shared_ptr<detail::stream_impl>> MStreamStorage;
32393250  detail::string MKernelName;
@@ -3554,7 +3565,7 @@ class __SYCL_EXPORT handler {
35543565  // / must not be used in a SYCL kernel function that is invoked via single_task
35553566  // / or via the simple form of parallel_for that takes a range parameter.
35563567  template  <typename  KernelName, typename  KernelType>
3557-   void  throwOnLocalAccessorMisuse () const  {
3568+   void  throwOnKernelParameterMisuse () const  {
35583569    using  NameT =
35593570        typename  detail::get_kernel_name_t <KernelName, KernelType>::name;
35603571    for  (unsigned  I = 0 ; I < detail::getKernelNumParams<NameT>(); ++I) {
@@ -3570,6 +3581,12 @@ class __SYCL_EXPORT handler {
35703581            " A local accessor must not be used in a SYCL kernel function " 
35713582            " that is invoked via single_task or via the simple form of " 
35723583            " parallel_for that takes a range parameter."  );
3584+       if  (Kind == detail::kernel_param_kind_t ::kind_work_group_memory)
3585+         throw  sycl::exception (
3586+             make_error_code (errc::kernel_argument),
3587+             " A work group memory object must not be used in a SYCL kernel " 
3588+             " function that is invoked via single_task or via the simple form " 
3589+             " of parallel_for that takes a range parameter."  );
35733590    }
35743591  }
35753592
0 commit comments