Skip to content

Commit 58a7b24

Browse files
committed
[SYCL] Use kernel types with the global namespace specifier.
That allows to avoid ambiguity in integration header for kernel types if namespaces with the same names are defined on different levels. Signed-off-by: Vladimir Lazarev <[email protected]>
1 parent d97c89d commit 58a7b24

File tree

2 files changed

+11
-7
lines changed

2 files changed

+11
-7
lines changed

clang/lib/Sema/SemaSYCL.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
#include "TreeTransform.h"
1313
#include "clang/AST/AST.h"
14+
#include "clang/AST/QualTypeNames.h"
1415
#include "clang/AST/RecordLayout.h"
1516
#include "clang/AST/RecursiveASTVisitor.h"
1617
#include "clang/Sema/Sema.h"
@@ -705,7 +706,10 @@ void Sema::ConstructSYCLKernel(FunctionDecl *KernelCallerFunc) {
705706
// Get Name for our kernel.
706707
const TemplateArgumentList *TemplateArgs =
707708
KernelCallerFunc->getTemplateSpecializationArgs();
708-
QualType KernelNameType = TemplateArgs->get(0).getAsType();
709+
QualType KernelNameType = TypeName::getFullyQualifiedType(
710+
TemplateArgs->get(0).getAsType(),
711+
getASTContext(),
712+
true);
709713
std::string Name = constructKernelName(KernelNameType);
710714
populateIntHeader(getSyclIntegrationHeader(), Name, KernelNameType, LE);
711715

clang/test/CodeGenSYCL/integration_header.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
// CHECK: static constexpr
1515
// CHECK-NEXT: const char* const kernel_names[] = {
1616
// CHECK-NEXT: "first_kernel",
17-
// CHECK-NEXT: "second_namespace::second_kernel<char>",
18-
// CHECK-NEXT: "third_kernel<1, int, point< X> >"
17+
// CHECK-NEXT: "::second_namespace::second_kernel<char>",
18+
// CHECK-NEXT: "::third_kernel<1, int, ::point<X> >"
1919
// CHECK-NEXT: };
2020
//
2121
// CHECK: static constexpr
@@ -27,12 +27,12 @@
2727
// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 2016, 5 },
2828
// CHECK-NEXT: { kernel_param_kind_t::kind_scalar, 1, 5 },
2929
// CHECK-EMPTY:
30-
// CHECK-NEXT: //--- second_namespace::second_kernel<char>
30+
// CHECK-NEXT: //--- ::second_namespace::second_kernel<char>
3131
// CHECK-NEXT: { kernel_param_kind_t::kind_scalar, 4, 0 },
3232
// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 2016, 4 },
3333
// CHECK-NEXT: { kernel_param_kind_t::kind_scalar, 1, 4 },
3434
// CHECK-EMPTY:
35-
// CHECK-NEXT: //--- third_kernel<1, int, point< X> >
35+
// CHECK-NEXT: //--- ::third_kernel<1, int, ::point<X> >
3636
// CHECK-NEXT: { kernel_param_kind_t::kind_scalar, 4, 0 },
3737
// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 2016, 4 },
3838
// CHECK-NEXT: { kernel_param_kind_t::kind_scalar, 1, 4 },
@@ -41,8 +41,8 @@
4141
//
4242
// CHECK: template <class KernelNameType> struct KernelInfo;
4343
// CHECK: template <> struct KernelInfo<class first_kernel> {
44-
// CHECK: template <> struct KernelInfo<class second_namespace::second_kernel<char>> {
45-
// CHECK: template <> struct KernelInfo<class third_kernel<1, int, struct point<struct X> >> {
44+
// CHECK: template <> struct KernelInfo<::second_namespace::second_kernel<char>> {
45+
// CHECK: template <> struct KernelInfo<::third_kernel<1, int, ::point<X> >> {
4646

4747
namespace cl {
4848
namespace sycl {

0 commit comments

Comments
 (0)