Skip to content

Commit 28d5931

Browse files
Ilya Stepykinromanovvlad
authored andcommitted
[SYCL] Propagate inline namespace to integration header.
Previously, if kernel name was declared inside inline namespaces the compilation failed since 'inline' keyword wasn't propagated to integration header. This patch fixes this issue. Signed-off-by: Ilya Stepykin <[email protected]>
1 parent 1d72965 commit 28d5931

File tree

2 files changed

+76
-1
lines changed

2 files changed

+76
-1
lines changed

clang/lib/Sema/SemaSYCL.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1412,7 +1412,9 @@ void SYCLIntegrationHeader::emitFwdDecl(raw_ostream &O, const Decl *D) {
14121412
break;
14131413
}
14141414
++NamespaceCnt;
1415-
NSStr.insert(0, Twine("namespace " + Twine(NS->getName()) + " { ").str());
1415+
const StringRef NSInlinePrefix = NS->isInline() ? "inline " : "";
1416+
NSStr.insert(
1417+
0, Twine(NSInlinePrefix + "namespace " + NS->getName() + " { ").str());
14161418
DC = NS->getDeclContext();
14171419
}
14181420
O << NSStr;
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
// RUN: %clang -I %S/Inputs --sycl -Xclang -fsycl-int-header=%t.h %s -c -o kernel.spv
2+
// RUN: FileCheck -input-file=%t.h %s
3+
4+
// This test checks if the SYCL device compiler is able to generate correct
5+
// integration header when the kernel name class is wrapped in an inline
6+
// namespace.
7+
8+
#include "sycl.hpp"
9+
10+
template <typename KernelName, typename KernelType>
11+
__attribute__((sycl_kernel)) void kernel_single_task(KernelType kernelFunc) {
12+
kernelFunc();
13+
}
14+
15+
// Top-level inline namespace
16+
// CHECK: inline namespace ns1 {
17+
// CHECK-NEXT: class Foo11;
18+
// CHECK-NEXT: }
19+
// CHECK-NEXT: inline namespace ns1 {
20+
// CHECK-NEXT: class Foo12;
21+
// CHECK-NEXT: }
22+
// CHECK-NEXT: inline namespace ns1 {
23+
// CHECK-NEXT: class Foo13;
24+
// CHECK-NEXT: }
25+
inline namespace ns1 {
26+
class Foo11 {};
27+
class Foo12;
28+
class Foo13 {};
29+
} // namespace ns1
30+
31+
// Nested inline namespace
32+
// CHECK-NEXT: namespace ns2 { inline namespace ns3 {
33+
// CHECK-NEXT: class Foo21;
34+
// CHECK-NEXT: }}
35+
// CHECK-NEXT: namespace ns2 { inline namespace ns3 {
36+
// CHECK-NEXT: class Foo22;
37+
// CHECK-NEXT: }}
38+
namespace ns2 {
39+
inline namespace ns3 {
40+
class Foo21 {};
41+
class Foo22;
42+
} // namespace ns3
43+
} // namespace ns2
44+
45+
// Namespace nested inside nested inline namespace
46+
// CHECK-NEXT: namespace ns4 { inline namespace ns5 { namespace ns6 {
47+
// CHECK-NEXT: class Foo31;
48+
// CHECK-NEXT: }}}
49+
// CHECK-NEXT: namespace ns4 { inline namespace ns5 { namespace ns6 {
50+
// CHECK-NEXT: class Foo32;
51+
// CHECK-NEXT: }}}
52+
namespace ns4 {
53+
inline namespace ns5 {
54+
namespace ns6 {
55+
class Foo31 {};
56+
class Foo32;
57+
} // namespace ns6
58+
} // namespace ns5
59+
} // namespace ns4
60+
61+
int main() {
62+
kernel_single_task<Foo11>([]() {});
63+
kernel_single_task<::Foo12>([]() {});
64+
kernel_single_task<ns1::Foo13>([]() {});
65+
66+
kernel_single_task<ns2::Foo21>([]() {});
67+
kernel_single_task<ns2::ns3::Foo22>([]() {});
68+
69+
kernel_single_task<ns4::ns6::Foo31>([]() {});
70+
kernel_single_task<ns4::ns5::ns6::Foo32>([]() {});
71+
72+
return 0;
73+
}

0 commit comments

Comments
 (0)