diff --git a/sycl/include/sycl/handler.hpp b/sycl/include/sycl/handler.hpp index d8d46d2a27814..a3f005086ae06 100644 --- a/sycl/include/sycl/handler.hpp +++ b/sycl/include/sycl/handler.hpp @@ -679,6 +679,8 @@ class __SYCL_EXPORT handler { accessor &&Arg) { detail::AccessorBaseHost *AccBase = (detail::AccessorBaseHost *)&Arg; const detail::AccessorImplPtr &AccImpl = detail::getSyclObjImpl(*AccBase); + // Ensure the data of AccImpl lives at least as long as the handler. + addLifetimeSharedPtrStorage(AccImpl); detail::AccessorImplHost *Req = AccImpl.get(); // Add accessor to the list of arguments. addArg(detail::kernel_param_kind_t::kind_accessor, Req, diff --git a/sycl/test-e2e/FreeFunctionKernels/enum_parameter.cpp b/sycl/test-e2e/FreeFunctionKernels/enum_parameter.cpp index bd54aa54efc38..cffe6e280f7d6 100644 --- a/sycl/test-e2e/FreeFunctionKernels/enum_parameter.cpp +++ b/sycl/test-e2e/FreeFunctionKernels/enum_parameter.cpp @@ -42,26 +42,26 @@ int main() { bool flag1, flag2, flag3; flag1 = (flag2 = (flag3 = false)); - rAccType acc1; - wAccType acc2; - rwAccType acc3; { sycl::buffer flagBuffer1(&flag1, 1); sycl::buffer flagBuffer2(&flag2, 1); sycl::buffer flagBuffer3(&flag3, 1); Queue.submit([&](sycl::handler &Handler) { + rAccType acc1; flagType flagAcc1{flagBuffer1, Handler}; Handler.set_args(acc1, rMode, flagAcc1); Handler.single_task(Kernel1); }); Queue.submit([&](sycl::handler &Handler) { + wAccType acc2; flagType flagAcc2{flagBuffer2, Handler}; Handler.set_args(acc2, wMode, flagAcc2); Handler.single_task(Kernel2); }); Queue.submit([&](sycl::handler &Handler) { + rwAccType acc3; flagType flagAcc3{flagBuffer3, Handler}; Handler.set_args(acc3, rwMode, flagAcc3); Handler.single_task(Kernel3);