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