| // RUN: %clang_cc1 -std=c++11 -fsyntax-only -fsycl-is-device -verify %s |
| |
| // No diagnostics |
| class [[clang::sycl_special_class]] class1 { |
| void __init(){} |
| }; |
| class __attribute__((sycl_special_class)) class2 { |
| void __init(){} |
| }; |
| |
| class class3; |
| class [[clang::sycl_special_class]] class3 { |
| void __init(){} |
| }; |
| |
| class class4; |
| class __attribute__((sycl_special_class)) class4 { |
| void __init(){} |
| }; |
| |
| struct [[clang::sycl_special_class]] struct1 { |
| void __init(){} |
| }; |
| struct __attribute__((sycl_special_class)) struct2 { |
| void __init(){} |
| }; |
| |
| class __attribute__((sycl_special_class)) class5; |
| class class5 { |
| void __init(){} |
| }; |
| |
| struct __attribute__((sycl_special_class)) struct6 { |
| struct6(); |
| bool operator==(const struct6 &); |
| struct6 &operator()(); |
| ~struct6(); |
| void __init(){} |
| }; |
| |
| // Must have one and only one __init method defined |
| class __attribute__((sycl_special_class)) class6 { // expected-error {{types with 'sycl_special_class' attribute must have one and only one '__init' method defined}} |
| class6() {} |
| }; |
| class [[clang::sycl_special_class]] class7 { // expected-error {{types with 'sycl_special_class' attribute must have one and only one '__init' method defined}} |
| void __init(); |
| }; |
| |
| class [[clang::sycl_special_class]] class8 { // expected-error {{types with 'sycl_special_class' attribute must have one and only one '__init' method defined}} |
| void __init(); |
| int func() {} |
| void __init(int a){} |
| }; |
| |
| struct __attribute__((sycl_special_class)) struct3; |
| struct struct3 {}; // expected-error {{types with 'sycl_special_class' attribute must have one and only one '__init' method defined}} |
| |
| // expected-error@+1{{'sycl_special_class' attribute must have one and only one '__init' method defined}} |
| struct __attribute__((sycl_special_class)) struct7 { |
| struct7(); |
| bool operator==(const struct7 &); |
| struct7 &operator()(); |
| ~struct7(); |
| }; |
| |
| // Only classes |
| [[clang::sycl_special_class]] int var1 = 0; // expected-warning {{'sycl_special_class' attribute only applies to classes}} |
| __attribute__((sycl_special_class)) int var2 = 0; // expected-warning {{'sycl_special_class' attribute only applies to classes}} |
| |
| [[clang::sycl_special_class]] void foo1(); // expected-warning {{'sycl_special_class' attribute only applies to classes}} |
| __attribute__((sycl_special_class)) void foo2(); // expected-warning {{'sycl_special_class' attribute only applies to classes}} |
| |
| // Attribute takes no arguments |
| class [[clang::sycl_special_class(1)]] class9{}; // expected-error {{'sycl_special_class' attribute takes no arguments}} |
| class __attribute__((sycl_special_class(1))) class10 {}; // expected-error {{'sycl_special_class' attribute takes no arguments}} |
| |
| // __init method must be defined inside the CXXRecordDecl. |
| class [[clang::sycl_special_class]] class11 { // expected-error {{types with 'sycl_special_class' attribute must have one and only one '__init' method defined}} |
| void __init(); |
| }; |
| void class11::__init(){} |
| |
| class __attribute__((sycl_special_class)) class12 { // expected-error {{types with 'sycl_special_class' attribute must have one and only one '__init' method defined}} |
| void __init(); |
| }; |
| void class12::__init(){} |
| |
| struct [[clang::sycl_special_class]] struct4 { // expected-error {{types with 'sycl_special_class' attribute must have one and only one '__init' method defined}} |
| void __init(); |
| }; |
| void struct4::__init(){} |
| |
| struct __attribute__((sycl_special_class)) struct5 { // expected-error {{types with 'sycl_special_class' attribute must have one and only one '__init' method defined}} |
| void __init(); |
| }; |
| void struct5::__init(){} |