2011-11-08 10:52:58 +08:00
// RUN: %clang_cc1 %s -verify -pedantic -fsyntax-only
2017-10-13 11:37:48 +08:00
// RUN: %clang_cc1 %s -cl-std=CL2.0 -verify -pedantic -fsyntax-only
2021-07-13 17:45:38 +08:00
// RUN: %clang_cc1 %s -cl-std=CL3.0 -cl-ext=+__opencl_c_generic_address_space -verify -pedantic -fsyntax-only
2021-09-01 16:14:07 +08:00
// RUN: %clang_cc1 %s -cl-std=clc++1.0 -verify -pedantic -fsyntax-only
// RUN: %clang_cc1 %s -cl-std=clc++2021 -cl-ext=+__opencl_c_generic_address_space -verify -pedantic -fsyntax-only
2011-11-08 10:52:58 +08:00
__constant int ci = 1 ;
2020-10-16 08:50:48 +08:00
// __constant ints are allowed in constant expressions.
enum use_ci_in_enum { enumerator = ci } ;
typedef int use_ci_in_array_bound[ci] ;
// general constant folding of array bounds is not permitted
typedef int folding_in_array_bounds[&ci + 3 - &ci] ; // expected-error-re {{{{variable length arrays are not supported in OpenCL|array size is not a constant expression}}}} expected-note {{cannot refer to element 3}}
2011-11-08 10:52:58 +08:00
__kernel void foo ( __global int *gip ) {
__local int li ;
__local int lj = 2 ; // expected-error {{'__local' variable cannot have an initializer}}
int *ip ;
2018-10-11 00:05:22 +08:00
# if ( ( !__OPENCL_CPP_VERSION__ ) && ( __OPENCL_C_VERSION__ < 200 ) )
2019-12-27 21:38:48 +08:00
ip = gip ; // expected-error {{assigning '__global int *__private' to '__private int *__private' changes address space of pointer}}
ip = &li ; // expected-error {{assigning '__local int *' to '__private int *__private' changes address space of pointer}}
ip = &ci ; // expected-error {{assigning '__constant int *' to '__private int *__private' changes address space of pointer}}
2017-10-13 11:37:48 +08:00
# else
ip = gip ;
ip = &li ;
2018-10-11 00:05:22 +08:00
ip = &ci ;
# if !__OPENCL_CPP_VERSION__
2019-12-27 21:38:48 +08:00
// expected-error@-2 {{assigning '__constant int * ' to '__generic int *__private ' changes address space of pointer}}
2018-10-11 00:05:22 +08:00
# else
2020-02-25 22:49:59 +08:00
// expected-error@-4 {{assigning '__constant int * ' to '__generic int * ' changes address space of pointer}}
2018-10-11 00:05:22 +08:00
# endif
2017-10-13 11:37:48 +08:00
# endif
2011-11-08 10:52:58 +08:00
}
2014-01-14 20:47:29 +08:00
2018-10-11 00:05:22 +08:00
void explicit_cast ( __global int *g, __local int *l, __constant int *c, __private int *p, const __constant int *cc ) {
2019-03-08 01:06:30 +08:00
g = ( __global int * ) l ;
# if !__OPENCL_CPP_VERSION__
// expected-error@-2 {{casting '__local int * ' to type '__global int * ' changes address space of pointer}}
# else
// expected-error@-4 {{C-style cast from '__local int * ' to '__global int * ' converts between mismatching address spaces}}
# endif
g = ( __global int * ) c ;
# if !__OPENCL_CPP_VERSION__
// expected-error@-2 {{casting '__constant int * ' to type '__global int * ' changes address space of pointer}}
# else
// expected-error@-4 {{C-style cast from '__constant int * ' to '__global int * ' converts between mismatching address spaces}}
# endif
g = ( __global int * ) cc ;
# if !__OPENCL_CPP_VERSION__
// expected-error@-2 {{casting 'const __constant int * ' to type '__global int * ' changes address space of pointer}}
# else
// expected-error@-4 {{C-style cast from 'const __constant int * ' to '__global int * ' converts between mismatching address spaces}}
# endif
g = ( __global int * ) p ;
# if !__OPENCL_CPP_VERSION__
2019-12-27 21:38:48 +08:00
// expected-error@-2 {{casting '__private int * ' to type '__global int * ' changes address space of pointer}}
2019-03-08 01:06:30 +08:00
# else
2019-12-27 21:38:48 +08:00
// expected-error@-4 {{C-style cast from '__private int * ' to '__global int * ' converts between mismatching address spaces}}
2019-03-08 01:06:30 +08:00
# endif
l = ( __local int * ) g ;
# if !__OPENCL_CPP_VERSION__
// expected-error@-2 {{casting '__global int * ' to type '__local int * ' changes address space of pointer}}
# else
// expected-error@-4 {{C-style cast from '__global int * ' to '__local int * ' converts between mismatching address spaces}}
# endif
l = ( __local int * ) c ;
# if !__OPENCL_CPP_VERSION__
// expected-error@-2 {{casting '__constant int * ' to type '__local int * ' changes address space of pointer}}
# else
// expected-error@-4 {{C-style cast from '__constant int * ' to '__local int * ' converts between mismatching address spaces}}
# endif
l = ( __local int * ) cc ;
# if !__OPENCL_CPP_VERSION__
// expected-error@-2 {{casting 'const __constant int * ' to type '__local int * ' changes address space of pointer}}
# else
// expected-error@-4 {{C-style cast from 'const __constant int * ' to '__local int * ' converts between mismatching address spaces}}
# endif
l = ( __local int * ) p ;
# if !__OPENCL_CPP_VERSION__
2019-12-27 21:38:48 +08:00
// expected-error@-2 {{casting '__private int * ' to type '__local int * ' changes address space of pointer}}
2019-03-08 01:06:30 +08:00
# else
2019-12-27 21:38:48 +08:00
// expected-error@-4 {{C-style cast from '__private int * ' to '__local int * ' converts between mismatching address spaces}}
2019-03-08 01:06:30 +08:00
# endif
c = ( __constant int * ) g ;
# if !__OPENCL_CPP_VERSION__
// expected-error@-2 {{casting '__global int * ' to type '__constant int * ' changes address space of pointer}}
# else
// expected-error@-4 {{C-style cast from '__global int * ' to '__constant int * ' converts between mismatching address spaces}}
# endif
c = ( __constant int * ) l ;
# if !__OPENCL_CPP_VERSION__
// expected-error@-2 {{casting '__local int * ' to type '__constant int * ' changes address space of pointer}}
# else
// expected-error@-4 {{C-style cast from '__local int * ' to '__constant int * ' converts between mismatching address spaces}}
# endif
c = ( __constant int * ) p ;
# if !__OPENCL_CPP_VERSION__
2019-12-27 21:38:48 +08:00
// expected-error@-2 {{casting '__private int * ' to type '__constant int * ' changes address space of pointer}}
2019-03-08 01:06:30 +08:00
# else
2019-12-27 21:38:48 +08:00
// expected-error@-4 {{C-style cast from '__private int * ' to '__constant int * ' converts between mismatching address spaces}}
2019-03-08 01:06:30 +08:00
# endif
p = ( __private int * ) g ;
# if !__OPENCL_CPP_VERSION__
2019-12-27 21:38:48 +08:00
// expected-error@-2 {{casting '__global int * ' to type '__private int * ' changes address space of pointer}}
2019-03-08 01:06:30 +08:00
# else
2019-12-27 21:38:48 +08:00
// expected-error@-4 {{C-style cast from '__global int * ' to '__private int * ' converts between mismatching address spaces}}
2019-03-08 01:06:30 +08:00
# endif
p = ( __private int * ) l ;
# if !__OPENCL_CPP_VERSION__
2019-12-27 21:38:48 +08:00
// expected-error@-2 {{casting '__local int * ' to type '__private int * ' changes address space of pointer}}
2019-03-08 01:06:30 +08:00
# else
2019-12-27 21:38:48 +08:00
// expected-error@-4 {{C-style cast from '__local int * ' to '__private int * ' converts between mismatching address spaces}}
2019-03-08 01:06:30 +08:00
# endif
p = ( __private int * ) c ;
# if !__OPENCL_CPP_VERSION__
2019-12-27 21:38:48 +08:00
// expected-error@-2 {{casting '__constant int * ' to type '__private int * ' changes address space of pointer}}
2019-03-08 01:06:30 +08:00
# else
2019-12-27 21:38:48 +08:00
// expected-error@-4 {{C-style cast from '__constant int * ' to '__private int * ' converts between mismatching address spaces}}
2019-03-08 01:06:30 +08:00
# endif
p = ( __private int * ) cc ;
# if !__OPENCL_CPP_VERSION__
2019-12-27 21:38:48 +08:00
// expected-error@-2 {{casting 'const __constant int * ' to type '__private int * ' changes address space of pointer}}
2019-03-08 01:06:30 +08:00
# else
2019-12-27 21:38:48 +08:00
// expected-error@-4 {{C-style cast from 'const __constant int * ' to '__private int * ' converts between mismatching address spaces}}
2019-03-08 01:06:30 +08:00
# endif
2014-01-14 20:47:29 +08:00
}
2018-10-11 00:05:22 +08:00
void ok_explicit_casts ( __global int *g, __global int *g2, __local int *l, __local int *l2, __private int *p, __private int *p2 ) {
g = ( __global int * ) g2 ;
l = ( __local int * ) l2 ;
p = ( __private int * ) p2 ;
2014-01-14 20:47:29 +08:00
}
2017-10-13 11:37:48 +08:00
2019-05-08 22:23:49 +08:00
# if !__OPENCL_CPP_VERSION__
void nested ( __global int *g, __global int * __private *gg, __local int *l, __local int * __private *ll, __global float * __private *gg_f ) {
2019-12-27 21:38:48 +08:00
g = gg ; // expected-error {{assigning '__global int *__private *__private' to '__global int *__private' changes address space of pointer}}
g = l ; // expected-error {{assigning '__local int *__private' to '__global int *__private' changes address space of pointer}}
g = ll ; // expected-error {{assigning '__local int *__private *__private' to '__global int *__private' changes address space of pointer}}
g = gg_f ; // expected-error {{assigning '__global float *__private *__private' to '__global int *__private' changes address space of pointer}}
g = ( __global int * ) gg_f ; // expected-error {{casting '__global float *__private *' to type '__global int *' changes address space of pointer}}
gg = g ; // expected-error {{assigning '__global int *__private' to '__global int *__private *__private' changes address space of pointer}}
gg = l ; // expected-error {{assigning '__local int *__private' to '__global int *__private *__private' changes address space of pointer}}
gg = ll ; // expected-error {{assigning '__local int *__private *__private' to '__global int *__private *__private' changes address space of nested pointer}}
gg = gg_f ; // expected-warning {{incompatible pointer types assigning to '__global int *__private *__private' from '__global float *__private *__private'}}
2019-05-08 22:23:49 +08:00
gg = ( __global int * __private * ) gg_f ;
2019-12-27 21:38:48 +08:00
l = g ; // expected-error {{assigning '__global int *__private' to '__local int *__private' changes address space of pointer}}
l = gg ; // expected-error {{assigning '__global int *__private *__private' to '__local int *__private' changes address space of pointer}}
l = ll ; // expected-error {{assigning '__local int *__private *__private' to '__local int *__private' changes address space of pointer}}
l = gg_f ; // expected-error {{assigning '__global float *__private *__private' to '__local int *__private' changes address space of pointer}}
l = ( __local int * ) gg_f ; // expected-error {{casting '__global float *__private *' to type '__local int *' changes address space of pointer}}
ll = g ; // expected-error {{assigning '__global int *__private' to '__local int *__private *__private' changes address space of pointer}}
ll = gg ; // expected-error {{assigning '__global int *__private *__private' to '__local int *__private *__private' changes address space of nested pointer}}
ll = l ; // expected-error {{assigning '__local int *__private' to '__local int *__private *__private' changes address space of pointer}}
ll = gg_f ; // expected-error {{assigning '__global float *__private *__private' to '__local int *__private *__private' changes address space of nested pointer}}
ll = ( __local int * __private * ) gg_f ; // expected-warning {{casting '__global float *__private *' to type '__local int *__private *' discards qualifiers in nested pointer types}}
gg_f = g ; // expected-error {{assigning '__global int *__private' to '__global float *__private *__private' changes address space of pointer}}
gg_f = gg ; // expected-warning {{incompatible pointer types assigning to '__global float *__private *__private' from '__global int *__private *__private'}}
gg_f = l ; // expected-error {{assigning '__local int *__private' to '__global float *__private *__private' changes address space of pointer}}
gg_f = ll ; // expected-error {{assigning '__local int *__private *__private' to '__global float *__private *__private' changes address space of nested pointer}}
2019-05-08 22:23:49 +08:00
gg_f = ( __global float * __private * ) gg ;
// FIXME: This doesn 't seem right. This should be an error, not a warning.
__local int * __global * __private * lll ;
2019-12-27 21:38:48 +08:00
lll = gg ; // expected-warning {{incompatible pointer types assigning to '__local int *__global *__private *__private' from '__global int *__private *__private'}}
2019-05-08 22:23:49 +08:00
typedef __local int * l_t ;
typedef __global int * g_t ;
__private l_t * pl ;
__private g_t * pg ;
2019-12-27 21:38:48 +08:00
gg = pl ; // expected-error {{assigning '__private l_t *__private' (aka '__local int *__private *__private') to '__global int *__private *__private' changes address space of nested pointer}}
pl = gg ; // expected-error {{assigning '__global int *__private *__private' to '__private l_t *__private' (aka '__local int *__private *__private') changes address space of nested pointer}}
2019-05-08 22:23:49 +08:00
gg = pg ;
pg = gg ;
2019-12-27 21:38:48 +08:00
pg = pl ; // expected-error {{assigning '__private l_t *__private' (aka '__local int *__private *__private') to '__private g_t *__private' (aka '__global int *__private *__private') changes address space of nested pointer}}
pl = pg ; // expected-error {{assigning '__private g_t *__private' (aka '__global int *__private *__private') to '__private l_t *__private' (aka '__local int *__private *__private') changes address space of nested pointer}}
2019-05-08 22:23:49 +08:00
ll = ( __local int * __private * ) ( void * ) gg ;
void *vp = ll ;
}
# else
void nested ( __global int *g, __global int * __private *gg, __local int *l, __local int * __private *ll, __global float * __private *gg_f ) {
2020-02-25 22:49:59 +08:00
g = gg ; // expected-error {{assigning '__global int *__private *__private' to '__global int *' changes address space of pointer}}
g = l ; // expected-error {{assigning '__local int *__private' to '__global int *' changes address space of pointer}}
g = ll ; // expected-error {{assigning '__local int *__private *__private' to '__global int *' changes address space of pointer}}
g = gg_f ; // expected-error {{assigning '__global float *__private *__private' to '__global int *' changes address space of pointer}}
2019-12-27 21:38:48 +08:00
g = ( __global int * ) gg_f ; // expected-error {{C-style cast from '__global float *__private *' to '__global int *' converts between mismatching address spaces}}
2020-02-25 22:49:59 +08:00
gg = g ; // expected-error {{assigning '__global int *__private' to '__global int *__private *' changes address space of pointer}}
gg = l ; // expected-error {{assigning '__local int *__private' to '__global int *__private *' changes address space of pointer}}
gg = ll ; // expected-error {{assigning '__local int *__private *__private' to '__global int *__private *' changes address space of nested pointer}}
gg = gg_f ; // expected-error {{incompatible pointer types assigning to '__global int *__private *' from '__global float *__private *__private'}}
2019-05-08 22:23:49 +08:00
gg = ( __global int * __private * ) gg_f ;
2020-02-25 22:49:59 +08:00
l = g ; // expected-error {{assigning '__global int *__private' to '__local int *' changes address space of pointer}}
l = gg ; // expected-error {{assigning '__global int *__private *__private' to '__local int *' changes address space of pointer}}
l = ll ; // expected-error {{assigning '__local int *__private *__private' to '__local int *' changes address space of pointer}}
l = gg_f ; // expected-error {{assigning '__global float *__private *__private' to '__local int *' changes address space of pointer}}
2019-12-27 21:38:48 +08:00
l = ( __local int * ) gg_f ; // expected-error {{C-style cast from '__global float *__private *' to '__local int *' converts between mismatching address spaces}}
2019-05-08 22:23:49 +08:00
2020-02-25 22:49:59 +08:00
ll = g ; // expected-error {{assigning '__global int *__private' to '__local int *__private *' changes address space of pointer}}
ll = gg ; // expected-error {{assigning '__global int *__private *__private' to '__local int *__private *' changes address space of nested pointer}}
ll = l ; // expected-error {{assigning '__local int *__private' to '__local int *__private *' changes address space of pointer}}
ll = gg_f ; // expected-error {{assigning '__global float *__private *__private' to '__local int *__private *' changes address space of nested pointer}}
2020-02-06 19:56:21 +08:00
ll = ( __local int *__private * ) gg ; //expected-warning{{C-style cast from '__global int *__private *' to '__local int *__private *' changes address space of nested pointers}}
2019-05-08 22:23:49 +08:00
2020-02-25 22:49:59 +08:00
gg_f = g ; // expected-error {{assigning '__global int *__private' to '__global float *__private *' changes address space of pointer}}
gg_f = gg ; // expected-error {{incompatible pointer types assigning to '__global float *__private *' from '__global int *__private *__private'}}
gg_f = l ; // expected-error {{assigning '__local int *__private' to '__global float *__private *' changes address space of pointer}}
gg_f = ll ; // expected-error {{assigning '__local int *__private *__private' to '__global float *__private *' changes address space of nested pointer}}
2019-05-08 22:23:49 +08:00
gg_f = ( __global float * __private * ) gg ;
typedef __local int * l_t ;
typedef __global int * g_t ;
__private l_t * pl ;
__private g_t * pg ;
2020-02-25 22:49:59 +08:00
gg = pl ; // expected-error {{assigning '__private l_t *__private' (aka '__local int *__private *__private') to '__global int *__private *' changes address space of nested pointer}}
pl = gg ; // expected-error {{assigning '__global int *__private *__private' to '__private l_t *' (aka '__local int *__private *') changes address space of nested pointer}}
2019-05-08 22:23:49 +08:00
gg = pg ;
pg = gg ;
2020-02-25 22:49:59 +08:00
pg = pl ; // expected-error {{assigning '__private l_t *__private' (aka '__local int *__private *__private') to '__private g_t *' (aka '__global int *__private *') changes address space of nested pointer}}
pl = pg ; // expected-error {{assigning '__private g_t *__private' (aka '__global int *__private *__private') to '__private l_t *' (aka '__local int *__private *') changes address space of nested pointer}}
2019-05-08 22:23:49 +08:00
ll = ( __local int * __private * ) ( void * ) gg ;
void *vp = ll ;
}
# endif
2017-10-13 11:37:48 +08:00
__private int func_return_priv ( void ) ; //expected-error {{return value cannot be qualified with address space}}
__global int func_return_global ( void ) ; //expected-error {{return value cannot be qualified with address space}}
__local int func_return_local ( void ) ; //expected-error {{return value cannot be qualified with address space}}
__constant int func_return_constant ( void ) ; //expected-error {{return value cannot be qualified with address space}}
# if __OPENCL_C_VERSION__ >= 200
__generic int func_return_generic ( void ) ; //expected-error {{return value cannot be qualified with address space}}
# endif
void func_multiple_addr ( void ) {
typedef __private int private_int_t ;
2018-08-03 09:21:16 +08:00
__private __local int var1 ; // expected-error {{multiple address spaces specified for type}}
__private __local int *var2 ; // expected-error {{multiple address spaces specified for type}}
2017-10-13 11:37:48 +08:00
__local private_int_t var3 ; // expected-error {{multiple address spaces specified for type}}
__local private_int_t *var4 ; // expected-error {{multiple address spaces specified for type}}
2018-06-20 16:31:24 +08:00
__private private_int_t var5 ; // expected-warning {{multiple identical address spaces specified for type}}
__private private_int_t *var6 ;// expected-warning {{multiple identical address spaces specified for type}}
2017-10-13 11:37:48 +08:00
}
2019-12-03 02:13:52 +08:00
void func_with_array_param ( const unsigned data[16] ) ;
__kernel void k ( ) {
unsigned data[16] ;
func_with_array_param ( data ) ;
}
2019-06-25 20:57:48 +08:00
void func_multiple_addr2 ( void ) {
typedef __private int private_int_t ;
2021-01-28 04:27:53 +08:00
__private __attribute__ ( ( opencl_global ) ) int var1 ; // expected-error {{multiple address spaces specified for type}} \
// expected-error {{function scope variable cannot be declared in global address space}}
2019-06-25 20:57:48 +08:00
__private __attribute__ ( ( opencl_global ) ) int *var2 ; // expected-error {{multiple address spaces specified for type}}
__attribute__ ( ( opencl_global ) ) private_int_t var3 ; // expected-error {{multiple address spaces specified for type}}
__attribute__ ( ( opencl_global ) ) private_int_t *var4 ; // expected-error {{multiple address spaces specified for type}}
__attribute__ ( ( opencl_private ) ) private_int_t var5 ; // expected-warning {{multiple identical address spaces specified for type}}
__attribute__ ( ( opencl_private ) ) private_int_t *var6 ; // expected-warning {{multiple identical address spaces specified for type}}
# if __OPENCL_CPP_VERSION__
[[clang::opencl_private]] __global int var7 ; // expected-error {{multiple address spaces specified for type}}
[[clang::opencl_private]] __global int *var8 ; // expected-error {{multiple address spaces specified for type}}
[[clang::opencl_private]] private_int_t var9 ; // expected-warning {{multiple identical address spaces specified for type}}
[[clang::opencl_private]] private_int_t *var10 ; // expected-warning {{multiple identical address spaces specified for type}}
# endif // !__OPENCL_CPP_VERSION__
}