diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index 226c72b3b93be..38e50fc3a36d3 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -823,7 +823,8 @@ class SingleDeviceFunctionTracker { // false-positives. if (isSYCLKernelBodyFunction(CurrentDecl)) { // This is a direct callee of the kernel. - if (CallStack.size() == 1) { + if (CallStack.size() == 1 && + CallStack.back()->hasAttr()) { assert(!KernelBody && "inconsistent call graph - only one kernel body " "function can be called"); KernelBody = CurrentDecl; diff --git a/clang/test/SemaSYCL/non-kernel-functor.cpp b/clang/test/SemaSYCL/non-kernel-functor.cpp new file mode 100644 index 0000000000000..f321d57dfded6 --- /dev/null +++ b/clang/test/SemaSYCL/non-kernel-functor.cpp @@ -0,0 +1,21 @@ +// RUN: %clang_cc1 -fsycl-is-device -triple spir64-unknown-unknown -verify %s + +// Test to verify that non-kernel functors are not processed as SYCL kernel +// functors + +// expected-no-diagnostics +class First { +public: + void operator()() { return; } +}; + +class Second { +public: + First operator()() { return First(); } +}; + +SYCL_EXTERNAL +void foo() { + Second NonKernelFunctorObj; + NonKernelFunctorObj()(); +}