xref: /llvm-project/clang/test/SemaSYCL/zero-length-arrays.cpp (revision 83ea47acd7116bf50274534ba9b3bd3035c01da6)
1*83ea47acSFangrui Song // RUN: %clang_cc1 -fsycl-is-device -triple spir64 -fsyntax-only -verify -std=c++14 %s
252e8f58dSMariya Podchishchaeva //
352e8f58dSMariya Podchishchaeva // This test checks if compiler reports compilation error on an attempt to use
452e8f58dSMariya Podchishchaeva // a zero-length array inside device code.
552e8f58dSMariya Podchishchaeva 
652e8f58dSMariya Podchishchaeva template <typename Name, typename Func>
kernel(const Func & kernelFunc)752e8f58dSMariya Podchishchaeva __attribute__((sycl_kernel)) void kernel(const Func &kernelFunc) {
852e8f58dSMariya Podchishchaeva   // expected-note@+1 5{{called by 'kernel}}
952e8f58dSMariya Podchishchaeva   kernelFunc(); // #KernelObjCall
1052e8f58dSMariya Podchishchaeva }
1152e8f58dSMariya Podchishchaeva 
1252e8f58dSMariya Podchishchaeva typedef float ZEROARR[0];
1352e8f58dSMariya Podchishchaeva 
1452e8f58dSMariya Podchishchaeva struct Wrapper {
1552e8f58dSMariya Podchishchaeva   int A;
1652e8f58dSMariya Podchishchaeva   int BadArray[0]; // expected-note 3{{field of illegal type 'int[0]' declared here}}
1752e8f58dSMariya Podchishchaeva };
1852e8f58dSMariya Podchishchaeva 
1952e8f58dSMariya Podchishchaeva struct WrapperOfWrapper { // expected-error 2{{zero-length arrays are not permitted in SYCL device code}}
2052e8f58dSMariya Podchishchaeva   Wrapper F;              // expected-note 2{{within field of type 'Wrapper' declared here}}
2152e8f58dSMariya Podchishchaeva   ZEROARR *Ptr;           //expected-note 5{{field of illegal pointer type 'ZEROARR *' (aka 'float (*)[0]') declared here}}
2252e8f58dSMariya Podchishchaeva };
2352e8f58dSMariya Podchishchaeva 
2452e8f58dSMariya Podchishchaeva template <unsigned Size> struct InnerTemplated {
2552e8f58dSMariya Podchishchaeva   double Array[Size]; // expected-note 8{{field of illegal type 'double[0]' declared here}}
2652e8f58dSMariya Podchishchaeva };
2752e8f58dSMariya Podchishchaeva 
2852e8f58dSMariya Podchishchaeva template <unsigned Size, typename Ty> struct Templated {
2952e8f58dSMariya Podchishchaeva   unsigned A;
3052e8f58dSMariya Podchishchaeva   Ty Arr[Size];
3152e8f58dSMariya Podchishchaeva   InnerTemplated<Size> Array[Size + 1]; // expected-note 8{{within field of type 'InnerTemplated<0U>[1]' declared here}}
3252e8f58dSMariya Podchishchaeva };
3352e8f58dSMariya Podchishchaeva 
3452e8f58dSMariya Podchishchaeva struct KernelSt {
3552e8f58dSMariya Podchishchaeva   int A;
3652e8f58dSMariya Podchishchaeva   int BadArray[0]; // expected-note {{field of illegal type 'int[0]' declared here}}
operator ()KernelSt3752e8f58dSMariya Podchishchaeva   void operator()() const {}
3852e8f58dSMariya Podchishchaeva };
3952e8f58dSMariya Podchishchaeva 
offendingFoo()4052e8f58dSMariya Podchishchaeva WrapperOfWrapper offendingFoo() {
4152e8f58dSMariya Podchishchaeva   // expected-note@+1 {{called by 'offendingFoo'}}
4252e8f58dSMariya Podchishchaeva   return WrapperOfWrapper{};
4352e8f58dSMariya Podchishchaeva }
4452e8f58dSMariya Podchishchaeva 
4552e8f58dSMariya Podchishchaeva template <unsigned Size>
templatedContext()4652e8f58dSMariya Podchishchaeva void templatedContext() {
4752e8f58dSMariya Podchishchaeva   Templated<Size, float> Var;
4852e8f58dSMariya Podchishchaeva   // expected-error@#KernelObjCall 2{{zero-length arrays are not permitted in SYCL device code}}
4952e8f58dSMariya Podchishchaeva   // expected-note@#KernelObjCall {{called by 'kernel<TempContext, (lambda at}}
5052e8f58dSMariya Podchishchaeva   // expected-note@+1 {{in instantiation of function template specialization}}
5152e8f58dSMariya Podchishchaeva   kernel<class TempContext>([=] {
5252e8f58dSMariya Podchishchaeva     // expected-note@+1 {{within field of type 'Templated<0U, float>' declared here}}
5352e8f58dSMariya Podchishchaeva     (void)Var; // expected-error 2{{zero-length arrays are not permitted in SYCL device code}}
5452e8f58dSMariya Podchishchaeva   });
5552e8f58dSMariya Podchishchaeva   // expected-error@#KernelObjCall {{zero-length arrays are not permitted in SYCL device code}}
5652e8f58dSMariya Podchishchaeva   // expected-note@+2 {{in instantiation of function template specialization}}
5752e8f58dSMariya Podchishchaeva   // expected-note@+1 {{within field of type 'Templated<0U, float>' declared here}}
5852e8f58dSMariya Podchishchaeva   kernel<class TempContext1>([Var] {
5952e8f58dSMariya Podchishchaeva   });
6052e8f58dSMariya Podchishchaeva }
6152e8f58dSMariya Podchishchaeva 
foo(const unsigned X)6252e8f58dSMariya Podchishchaeva void foo(const unsigned X) {
6352e8f58dSMariya Podchishchaeva   int Arr[0];      // expected-note 2{{declared here}}
6452e8f58dSMariya Podchishchaeva   ZEROARR TypeDef; // expected-note {{declared here}}
6552e8f58dSMariya Podchishchaeva   ZEROARR *Ptr;    // expected-note {{declared here}}
6652e8f58dSMariya Podchishchaeva                    // expected-error@#KernelObjCall 3{{zero-length arrays are not permitted in SYCL device code}}
6752e8f58dSMariya Podchishchaeva   // expected-note@+1 {{in instantiation of function template specialization}}
6852e8f58dSMariya Podchishchaeva   kernel<class Simple>([=]() {
6952e8f58dSMariya Podchishchaeva     (void)Arr;     // expected-error {{zero-length arrays are not permitted in SYCL device code}}
7052e8f58dSMariya Podchishchaeva     (void)TypeDef; // expected-error {{zero-length arrays are not permitted in SYCL device code}}
7152e8f58dSMariya Podchishchaeva     // expected-note@+1 {{field of illegal pointer type 'ZEROARR *' (aka 'float (*)[0]') declared here}}
7252e8f58dSMariya Podchishchaeva     (void)Ptr; // expected-error {{zero-length arrays are not permitted in SYCL device code}}
7352e8f58dSMariya Podchishchaeva   });
7452e8f58dSMariya Podchishchaeva   // expected-error@#KernelObjCall {{zero-length arrays are not permitted in SYCL device code}}
7552e8f58dSMariya Podchishchaeva   // expected-note@+2 {{in instantiation of function template specialization}}
7652e8f58dSMariya Podchishchaeva   // expected-note@+1 {{field of illegal type 'int[0]' declared here}}
7752e8f58dSMariya Podchishchaeva   kernel<class Simple1>([Arr] { // expected-error {{zero-length arrays are not permitted in SYCL device code}}
7852e8f58dSMariya Podchishchaeva   });
7952e8f58dSMariya Podchishchaeva   WrapperOfWrapper St;
8052e8f58dSMariya Podchishchaeva   // expected-error@#KernelObjCall 2{{zero-length arrays are not permitted in SYCL device code}}
8152e8f58dSMariya Podchishchaeva   // expected-note@+1 {{in instantiation of function template specialization}}
8252e8f58dSMariya Podchishchaeva   kernel<class SimpleStruct>([=] {
8352e8f58dSMariya Podchishchaeva     // expected-note@+1 {{within field of type 'WrapperOfWrapper' declared here}}
8452e8f58dSMariya Podchishchaeva     (void)St.F.BadArray; // expected-error 4{{zero-length arrays are not permitted in SYCL device code}}
8552e8f58dSMariya Podchishchaeva   });
8652e8f58dSMariya Podchishchaeva   // expected-error@#KernelObjCall 2{{zero-length arrays are not permitted in SYCL device code}}
8752e8f58dSMariya Podchishchaeva   // expected-note@+2 {{in instantiation of function template specialization}}
8852e8f58dSMariya Podchishchaeva   // expected-note@+1 {{within field of type 'WrapperOfWrapper' declared here}}
8952e8f58dSMariya Podchishchaeva   kernel<class SimpleStruct1>([St] { // expected-error 2{{zero-length arrays are not permitted in SYCL device code}}
9052e8f58dSMariya Podchishchaeva   });
9152e8f58dSMariya Podchishchaeva 
9252e8f58dSMariya Podchishchaeva   Templated<1, int> OK;
9352e8f58dSMariya Podchishchaeva   Templated<1 - 1, double> Weirdo;
9452e8f58dSMariya Podchishchaeva   Templated<0, float> Zero;
9552e8f58dSMariya Podchishchaeva   // expected-error@#KernelObjCall 4{{zero-length arrays are not permitted in SYCL device code}}
9652e8f58dSMariya Podchishchaeva   // expected-note@+1 {{in instantiation of function template specialization}}
9752e8f58dSMariya Podchishchaeva   kernel<class UseTemplated>([=] {
9852e8f58dSMariya Podchishchaeva     (void)OK;   // No errors expected
9952e8f58dSMariya Podchishchaeva     (void)Zero; // expected-error 2{{zero-length arrays are not permitted in SYCL device code}}
10052e8f58dSMariya Podchishchaeva     // expected-note@+1 {{within field of type 'Templated<1 - 1, double>' declared here}}
10152e8f58dSMariya Podchishchaeva     int A = Weirdo.A; // expected-error 2{{zero-length arrays are not permitted in SYCL device code}}
10252e8f58dSMariya Podchishchaeva   });
10352e8f58dSMariya Podchishchaeva 
10452e8f58dSMariya Podchishchaeva   // expected-note@#KernelObjCall {{called by 'kernel<UseTemplated1, (lambda at}}
10552e8f58dSMariya Podchishchaeva   // expected-error@#KernelObjCall 2{{zero-length arrays are not permitted in SYCL device code}}
10652e8f58dSMariya Podchishchaeva   // expected-note@+2 {{in instantiation of function template specialization}}
10752e8f58dSMariya Podchishchaeva   // expected-note@+1 {{within field of type 'Templated<0, float>' declared here}}
10852e8f58dSMariya Podchishchaeva   kernel<class UseTemplated1>([Zero] { // expected-error 2{{zero-length arrays are not permitted in SYCL device code}}
10952e8f58dSMariya Podchishchaeva   });
11052e8f58dSMariya Podchishchaeva 
11152e8f58dSMariya Podchishchaeva   templatedContext<10>();
11252e8f58dSMariya Podchishchaeva   // expected-note@+1 2{{in instantiation of function template specialization}}
11352e8f58dSMariya Podchishchaeva   templatedContext<0>();
11452e8f58dSMariya Podchishchaeva 
11552e8f58dSMariya Podchishchaeva   KernelSt K;
11652e8f58dSMariya Podchishchaeva   // expected-error@#KernelObjCall {{zero-length arrays are not permitted in SYCL device code}}
11752e8f58dSMariya Podchishchaeva   // expected-note@+1 {{in instantiation of function template specialization}}
11852e8f58dSMariya Podchishchaeva   kernel<class UseFunctor>(K);
11952e8f58dSMariya Podchishchaeva 
12052e8f58dSMariya Podchishchaeva   // expected-note@#KernelObjCall {{called by 'kernel<ReturnFromFunc, (lambda at}}
12152e8f58dSMariya Podchishchaeva   kernel<class ReturnFromFunc>([=] {
12252e8f58dSMariya Podchishchaeva     // expected-note@+1 {{called by 'operator()'}}
12352e8f58dSMariya Podchishchaeva     offendingFoo();
12452e8f58dSMariya Podchishchaeva   });
12552e8f58dSMariya Podchishchaeva }
126