================ @@ -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@+1{{'clang::sycl_external' can only be applied to functions with external linkage}} +[[clang::sycl_external]] +static void func1() {} + +// expected-error@+2{{'clang::sycl_external' can only be applied to functions with external linkage}} +namespace { + [[clang::sycl_external]] + void func2() {} +} + +// expected-error@+2{{'clang::sycl_external' can only be applied to functions with external linkage}} +namespace { struct S4 {}; } +[[clang::sycl_external]] void func4(S4) {} + +// expected-error@+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@-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@+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@-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@-1{{'clang::sycl_external' attribute does not appear on the first declaration}} +// expected-error@-2{{'clang::sycl_external' can only be applied to functions with external linkage}} +// expected-note@-3{{previous declaration is here}} + +// FIXME: The implicit instantiation of func9<S9>() is valid. +namespace { struct S9 {}; } +struct T9 { + using type = S9; +}; +// expected-error@+2{{'clang::sycl_external' can only be applied to functions with external linkage}} +template<typename> +[[clang::sycl_external]] void func9() {} +// expected-note@+3{{in instantiation of function template specialization 'func9<(anonymous namespace)::S9>' requested here}} +template<typename T> +[[clang::sycl_external]] void test_func9() { + func9<typename T::type>(); +} +// expected-note@+1{{in instantiation of function template specialization 'test_func9<T9>' requested here}} +template void test_func9<T9>(); // FIXME: don't diagnose implicit instantiation of func9<S9>(). ---------------- tahonermann wrote:
These diagnostics should disappear with the suggested changes. Please ensure the FIXME comments are removed too. https://github.com/llvm/llvm-project/pull/140282 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits