[clang] [clang][SYCL] Add sycl_external attribute and restrict emitting device code (PR #140282)
Tom Honermann via cfe-commits
cfe-commits at lists.llvm.org
Wed Aug 13 20:52:08 PDT 2025
================
@@ -0,0 +1,157 @@
+// RUN: %clang_cc1 -fsycl-is-host -std=c++17 -fsyntax-only -verify %s
+// RUN: %clang_cc1 -fsycl-is-device -std=c++17 -fsyntax-only -verify %s
+// RUN: %clang_cc1 -fsycl-is-host -std=c++20 -fsyntax-only -verify -DCPP20 %s
+// RUN: %clang_cc1 -fsycl-is-device -std=c++20 -fsyntax-only -verify -DCPP20 %s
+
+// Semantic tests for the sycl_external attribute.
+
+// expected-error at +1{{'clang::sycl_external' can only be applied to functions with external linkage}}
+[[clang::sycl_external]]
+static void func1() {}
+
+// expected-error at +2{{'clang::sycl_external' can only be applied to functions with external linkage}}
+namespace {
+ [[clang::sycl_external]]
+ void func2() {}
+}
+
+// expected-error at +2{{'clang::sycl_external' can only be applied to functions with external linkage}}
+namespace { struct S4 {}; }
+[[clang::sycl_external]] void func4(S4) {}
+
+// expected-error at +3{{'clang::sycl_external' can only be applied to functions with external linkage}}
+namespace { struct S6 {}; }
+template<typename>
+[[clang::sycl_external]] void func6() {}
+template void func6<S6>();
+// expected-note at -1{{in instantiation of function template specialization 'func6<(anonymous namespace)::S6>' requested here}}
+
+// FIXME: C++23 [temp.expl.spec]p12 states:
+// ... Similarly, attributes appearing in the declaration of a template
+// have no effect on an explicit specialization of that template.
+// Clang currently instantiates and propagates attributes from a function
+// template to its explicit specializations resulting in the following
+// spurious error.
+// expected-error at +3 2{{'clang::sycl_external' can only be applied to functions with external linkage}}
+namespace { struct S7 {}; }
+template<typename>
+[[clang::sycl_external]] void func7();
+template<> void func7<S7>() {}
+// expected-note at -1{{in instantiation of function template specialization 'func7<(anonymous namespace)::S7>' requested here}}
+
+// FIXME: The explicit function template specialization appears to trigger
+// instantiation of a declaration from the primary template without the
+// attribute leading to a spurious diagnostic that the sycl_external
+// attribute is not present on the first declaration.
+namespace { struct S8 {}; }
+template<typename>
+void func8();
+template<> [[clang::sycl_external]] void func8<S8>() {}
+// expected-warning at -1{{'clang::sycl_external' attribute does not appear on the first declaration}}
+// expected-error at -2{{'clang::sycl_external' can only be applied to functions with external linkage}}
+// expected-note at -3{{previous declaration is here}}
+
----------------
tahonermann wrote:
Let's insert one more explicit template specialization test here. Please adjust the numbers in the names of the preceding declarations accordingly; note that `S5`/`func5` is currently unused. A diagnostic is expected for this case.
```
namespace { struct S8 {}; }
template<typename>
[[clang::sycl_external]] void func8();
template<> [[clang::sycl_external]] void func8<S8>() {}
```
https://github.com/llvm/llvm-project/pull/140282
More information about the cfe-commits
mailing list