blob: 78dd89696c02d4bfa14831262d5d0f3f91964f53 [file] [log] [blame] [edit]
// RUN: %clang_cc1 -triple x86_64-linux-gnu -std=c++17 -fsyntax-only -fsycl-is-device -verify %s
// RUN: %clang_cc1 -triple x86_64-linux-gnu -std=c++20 -fsyntax-only -fsycl-is-device -verify %s
// These tests validate that the kernel name type argument provided to the
// sycl_kernel_entry_point attribute meets the requirements of a SYCL kernel
// name as described in section 5.2, "Naming of kernels", of the SYCL 2020
// specification.
struct S1;
// expected-warning@+3 {{redundant 'sycl_kernel_entry_point' attribute}}
// expected-note@+1 {{previous attribute is here}}
[[clang::sycl_kernel_entry_point(S1),
clang::sycl_kernel_entry_point(S1)]]
void ok1();
// expected-error@+1 {{'int' is not a valid SYCL kernel name type; a non-union class type is required}}
[[clang::sycl_kernel_entry_point(int)]] void bad2();
// expected-error@+1 {{'int ()' is not a valid SYCL kernel name type; a non-union class type is required}}
[[clang::sycl_kernel_entry_point(int())]] void bad3();
// expected-error@+1 {{'int (*)()' is not a valid SYCL kernel name type; a non-union class type is required}}
[[clang::sycl_kernel_entry_point(int(*)())]] void bad4();
// expected-error@+1 {{'int (&)()' is not a valid SYCL kernel name type; a non-union class type is required}}
[[clang::sycl_kernel_entry_point(int(&)())]] void bad5();
// expected-error@+1 {{'decltype(nullptr)' (aka 'std::nullptr_t') is not a valid SYCL kernel name type; a non-union class type is required}}
[[clang::sycl_kernel_entry_point(decltype(nullptr))]] void bad6();
union U7; // #U7-decl
// expected-error@+2 {{'U7' is not a valid SYCL kernel name type; a non-union class type is required}}
// expected-note@#U7-decl {{'U7' declared here}}
[[clang::sycl_kernel_entry_point(U7)]] void bad7();
enum E8 {}; // #E8-decl
// expected-error@+2 {{'E8' is not a valid SYCL kernel name type; a non-union class type is required}}
// expected-note@#E8-decl {{'E8' declared here}}
[[clang::sycl_kernel_entry_point(E8)]] void bad8();
enum E9 : int; // #E9-decl
// expected-error@+2 {{'E9' is not a valid SYCL kernel name type; a non-union class type is required}}
// expected-note@#E9-decl {{'E9' declared here}}
[[clang::sycl_kernel_entry_point(E9)]] void bad9();
struct B10 {
struct MS;
};
// FIXME-expected-error@+1 {{'sycl_kernel_entry_point' attribute argument must be a forward declarable class type}}
[[clang::sycl_kernel_entry_point(B10::MS)]] void bad10();
struct B11 {
struct MS;
};
// FIXME-expected-error@+3 {{'sycl_kernel_entry_point' attribute argument must be a forward declarable class type}}
template<typename T>
[[clang::sycl_kernel_entry_point(typename T::MS)]] void bad11() {}
template void bad11<B11>();
template<typename T>
[[clang::sycl_kernel_entry_point(T)]] void bad12();
void f12() {
// FIXME-expected-error@+2 {{'sycl_kernel_entry_point' attribute argument must be a forward declarable class type}}
struct LS;
bad12<LS>();
}
struct B13_1;
struct B13_2;
// expected-error@+3 {{'sycl_kernel_entry_point' kernel name argument does not match prior declaration: 'B13_2' vs 'B13_1'}}
// expected-note@+1 {{'bad13' declared here}}
[[clang::sycl_kernel_entry_point(B13_1)]] void bad13();
[[clang::sycl_kernel_entry_point(B13_2)]] void bad13() {}
struct B14_1;
struct B14_2;
// expected-error@+3 {{'sycl_kernel_entry_point' kernel name argument does not match prior declaration: 'B14_2' vs 'B14_1'}}
// expected-note@+1 {{previous attribute is here}}
[[clang::sycl_kernel_entry_point(B14_1),
clang::sycl_kernel_entry_point(B14_2)]]
void bad14();
struct B15;
// expected-error@+3 {{'sycl_kernel_entry_point' kernel name argument conflicts with a previous declaration}}
// expected-note@+1 {{previous declaration is here}}
[[clang::sycl_kernel_entry_point(B15)]] void bad15_1();
[[clang::sycl_kernel_entry_point(B15)]] void bad15_2();
struct B16_1;
struct B16_2;
// expected-error@+4 {{'sycl_kernel_entry_point' kernel name argument does not match prior declaration: 'B16_2' vs 'B16_1'}}
// expected-note@+1 {{'bad16' declared here}}
[[clang::sycl_kernel_entry_point(B16_1)]] void bad16();
void bad16(); // The attribute from the previous declaration is inherited.
[[clang::sycl_kernel_entry_point(B16_2)]] void bad16();
template<int>
struct B17 {
// expected-error@+1 {{'int' is not a valid SYCL kernel name type; a non-union class type is required}}
[[clang::sycl_kernel_entry_point(int)]]
static void bad17();
};
template<int>
struct B18 {
// expected-error@+1 {{'int' is not a valid SYCL kernel name type; a non-union class type is required}}
[[clang::sycl_kernel_entry_point(int)]]
friend void bad18() {}
};
template<typename KNT>
struct B19 {
// expected-error@+1 {{'int' is not a valid SYCL kernel name type; a non-union class type is required}}
[[clang::sycl_kernel_entry_point(KNT)]]
friend void bad19() {}
};
// expected-note@+1 {{in instantiation of template class 'B19<int>' requested here}}
B19<int> b19;