xref: /aosp_15_r20/external/clang/test/SemaOpenCL/invalid-kernel-parameters.cl (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// RUN: %clang_cc1 -fsyntax-only -verify %s -triple spir-unknown-unknown
2*67e74705SXin Li
3*67e74705SXin Li#pragma OPENCL EXTENSION cl_khr_fp16 : enable
4*67e74705SXin Li
5*67e74705SXin Li
6*67e74705SXin Li// Disallowed: parameters with type
7*67e74705SXin Li// bool, half, size_t, ptrdiff_t, intptr_t, and uintptr_t
8*67e74705SXin Li// or a struct / union with any of these types in them
9*67e74705SXin Li
10*67e74705SXin Li// TODO: Ban int types, size_t, ptrdiff_t ...
11*67e74705SXin Li
12*67e74705SXin Likernel void bool_arg(bool x) { } // expected-error{{'bool' cannot be used as the type of a kernel parameter}}
13*67e74705SXin Li
14*67e74705SXin Likernel void half_arg(half x) { } // expected-error{{'half' cannot be used as the type of a kernel parameter}}
15*67e74705SXin Li
16*67e74705SXin Litypedef struct ContainsBool // expected-note{{within field of type 'ContainsBool' declared here}}
17*67e74705SXin Li{
18*67e74705SXin Li  bool x; // expected-note{{field of illegal type 'bool' declared here}}
19*67e74705SXin Li} ContainsBool;
20*67e74705SXin Li
21*67e74705SXin Likernel void bool_in_struct_arg(ContainsBool x) { } // expected-error{{'ContainsBool' (aka 'struct ContainsBool') cannot be used as the type of a kernel parameter}}
22*67e74705SXin Li
23*67e74705SXin Li
24*67e74705SXin Li
25*67e74705SXin Litypedef struct FooImage2D // expected-note{{within field of type 'FooImage2D' declared here}}
26*67e74705SXin Li{
27*67e74705SXin Li  // TODO: Clean up needed - we don't really need to check for image, event, etc
28*67e74705SXin Li  // as a note here any longer.
29*67e74705SXin Li  // They are diagnosed as an error for all struct fields (OpenCL v1.2 s6.9b,r).
30*67e74705SXin Li  image2d_t imageField; // expected-note{{field of illegal type '__read_only image2d_t' declared here}} expected-error{{the '__read_only image2d_t' type cannot be used to declare a structure or union field}}
31*67e74705SXin Li} FooImage2D;
32*67e74705SXin Li
33*67e74705SXin Likernel void image_in_struct_arg(FooImage2D arg) { } // expected-error{{struct kernel parameters may not contain pointers}}
34*67e74705SXin Li
35*67e74705SXin Litypedef struct Foo // expected-note{{within field of type 'Foo' declared here}}
36*67e74705SXin Li{
37*67e74705SXin Li  int* ptrField; // expected-note{{field of illegal pointer type 'int *' declared here}}
38*67e74705SXin Li} Foo;
39*67e74705SXin Li
40*67e74705SXin Likernel void pointer_in_struct_arg(Foo arg) { } // expected-error{{struct kernel parameters may not contain pointers}}
41*67e74705SXin Li
42*67e74705SXin Litypedef union FooUnion // expected-note{{within field of type 'FooUnion' declared here}}
43*67e74705SXin Li{
44*67e74705SXin Li  int* ptrField; // expected-note{{field of illegal pointer type 'int *' declared here}}
45*67e74705SXin Li} FooUnion;
46*67e74705SXin Li
47*67e74705SXin Likernel void pointer_in_union_arg(FooUnion arg) { }// expected-error{{union kernel parameters may not contain pointers}}
48*67e74705SXin Li
49*67e74705SXin Litypedef struct NestedPointer // expected-note 2 {{within field of type 'NestedPointer' declared here}}
50*67e74705SXin Li{
51*67e74705SXin Li  int x;
52*67e74705SXin Li  struct InnerNestedPointer
53*67e74705SXin Li  {
54*67e74705SXin Li    int* ptrField; // expected-note 3 {{field of illegal pointer type 'int *' declared here}}
55*67e74705SXin Li  } inner; // expected-note 3 {{within field of type 'struct InnerNestedPointer' declared here}}
56*67e74705SXin Li} NestedPointer;
57*67e74705SXin Li
58*67e74705SXin Likernel void pointer_in_nested_struct_arg(NestedPointer arg) { }// expected-error{{struct kernel parameters may not contain pointers}}
59*67e74705SXin Li
60*67e74705SXin Listruct NestedPointerComplex // expected-note{{within field of type 'NestedPointerComplex' declared here}}
61*67e74705SXin Li{
62*67e74705SXin Li  int foo;
63*67e74705SXin Li  float bar;
64*67e74705SXin Li
65*67e74705SXin Li  struct InnerNestedPointerComplex
66*67e74705SXin Li  {
67*67e74705SXin Li    int innerFoo;
68*67e74705SXin Li    int* innerPtrField; // expected-note{{field of illegal pointer type 'int *' declared here}}
69*67e74705SXin Li  } inner; // expected-note{{within field of type 'struct InnerNestedPointerComplex' declared here}}
70*67e74705SXin Li
71*67e74705SXin Li  float y;
72*67e74705SXin Li  float z[4];
73*67e74705SXin Li};
74*67e74705SXin Li
75*67e74705SXin Likernel void pointer_in_nested_struct_arg_complex(struct NestedPointerComplex arg) { }// expected-error{{struct kernel parameters may not contain pointers}}
76*67e74705SXin Li
77*67e74705SXin Litypedef struct NestedBool // expected-note 2 {{within field of type 'NestedBool' declared here}}
78*67e74705SXin Li{
79*67e74705SXin Li  int x;
80*67e74705SXin Li  struct InnerNestedBool
81*67e74705SXin Li  {
82*67e74705SXin Li    bool boolField; // expected-note 2 {{field of illegal type 'bool' declared here}}
83*67e74705SXin Li  } inner; // expected-note 2 {{within field of type 'struct InnerNestedBool' declared here}}
84*67e74705SXin Li} NestedBool;
85*67e74705SXin Li
86*67e74705SXin Likernel void bool_in_nested_struct_arg(NestedBool arg) { } // expected-error{{'NestedBool' (aka 'struct NestedBool') cannot be used as the type of a kernel parameter}}
87*67e74705SXin Li
88*67e74705SXin Li// Warning emitted again for argument used in other kernel
89*67e74705SXin Likernel void bool_in_nested_struct_arg_again(NestedBool arg) { } // expected-error{{'NestedBool' (aka 'struct NestedBool') cannot be used as the type of a kernel parameter}}
90*67e74705SXin Li
91*67e74705SXin Li
92*67e74705SXin Li// Check for note with a struct not defined inside the struct
93*67e74705SXin Litypedef struct NestedBool2Inner
94*67e74705SXin Li{
95*67e74705SXin Li  bool boolField; // expected-note{{field of illegal type 'bool' declared here}}
96*67e74705SXin Li} NestedBool2Inner;
97*67e74705SXin Li
98*67e74705SXin Litypedef struct NestedBool2 // expected-note{{within field of type 'NestedBool2' declared here}}
99*67e74705SXin Li{
100*67e74705SXin Li  int x;
101*67e74705SXin Li  NestedBool2Inner inner; // expected-note{{within field of type 'NestedBool2Inner' (aka 'struct NestedBool2Inner') declared here}}
102*67e74705SXin Li} NestedBool2;
103*67e74705SXin Li
104*67e74705SXin Likernel void bool_in_nested_struct_2_arg(NestedBool2 arg) { } // expected-error{{'NestedBool2' (aka 'struct NestedBool2') cannot be used as the type of a kernel parameter}}
105*67e74705SXin Li
106*67e74705SXin Li
107*67e74705SXin Listruct InnerInner
108*67e74705SXin Li{
109*67e74705SXin Li  int* foo;
110*67e74705SXin Li  bool x;
111*67e74705SXin Li};
112*67e74705SXin Li
113*67e74705SXin Listruct Valid
114*67e74705SXin Li{
115*67e74705SXin Li  float c;
116*67e74705SXin Li  float d;
117*67e74705SXin Li};
118*67e74705SXin Li
119*67e74705SXin Listruct Inner
120*67e74705SXin Li{
121*67e74705SXin Li  struct Valid v;
122*67e74705SXin Li  struct InnerInner a;
123*67e74705SXin Li  struct Valid g;
124*67e74705SXin Li  struct InnerInner b;
125*67e74705SXin Li};
126*67e74705SXin Li
127*67e74705SXin Listruct AlsoUser // expected-note{{within field of type 'AlsoUser' declared here}}
128*67e74705SXin Li{
129*67e74705SXin Li  float x;
130*67e74705SXin Li  struct Valid valid1;
131*67e74705SXin Li  struct Valid valid2;
132*67e74705SXin Li  struct NestedPointer aaaa; // expected-note{{within field of type 'struct NestedPointer' declared here}}
133*67e74705SXin Li};
134*67e74705SXin Li
135*67e74705SXin Likernel void pointer_in_nested_struct_arg_2(struct Valid valid, struct NestedPointer arg, struct AlsoUser also) { } // expected-error 2 {{struct kernel parameters may not contain pointers}}
136