blob: 79b5cb0883f04a7db588764824d258092e5682ef [file]
// { dg-do compile }
/* { dg-additional-options "-Wno-deprecated-openmp" } */
#include <omp.h>
/*
typedef __UINTPTR_TYPE__ omp_uintptr_t;
#if __cplusplus >= 201103L
# define __GOMP_UINTPTR_T_ENUM : omp_uintptr_t
#else
# define __GOMP_UINTPTR_T_ENUM
#endif
typedef enum omp_memspace_handle_t __GOMP_UINTPTR_T_ENUM
{
omp_default_mem_space = 0,
omp_large_cap_mem_space = 1,
omp_const_mem_space = 2,
omp_high_bw_mem_space = 3,
omp_low_lat_mem_space = 4,
ompx_gnu_managed_mem_space = 200,
__omp_memspace_handle_t_max__ = __UINTPTR_MAX__
} omp_memspace_handle_t;
typedef enum omp_allocator_handle_t __GOMP_UINTPTR_T_ENUM
{
omp_null_allocator = 0,
omp_default_mem_alloc = 1,
omp_large_cap_mem_alloc = 2,
omp_const_mem_alloc = 3,
omp_high_bw_mem_alloc = 4,
omp_low_lat_mem_alloc = 5,
omp_cgroup_mem_alloc = 6,
omp_pteam_mem_alloc = 7,
omp_thread_mem_alloc = 8,
ompx_gnu_pinned_mem_alloc = 200,
ompx_gnu_managed_mem_alloc = 201,
__omp_allocator_handle_t_max__ = __UINTPTR_MAX__
} omp_allocator_handle_t;
typedef struct omp_alloctrait_t
{
// omp_alloctrait_key_t key;
// omp_uintptr_t value;
} omp_alloctrait_t;
*/
template<typename TH, TH alloc>
void f()
{
#pragma omp target uses_allocators(alloc)
;
}
template<typename TH, typename TT>
void g(TT trait, TH alloc)
{
#pragma omp target uses_allocators(alloc)
;
#pragma omp target uses_allocators(alloc(trait))
// { dg-error "traits array 'trait' must be defined in same scope as the construct on which the clause appears" "" { target *-*-* } .-1 }
// { dg-error "traits array 'trait' must be of 'const omp_alloctrait_t \\\[\\\]' type" "" { target *-*-* } .-2 }
;
}
void use()
{
omp_allocator_handle_t my;
static const omp_alloctrait_t t[] = {};
f<omp_allocator_handle_t, omp_null_allocator>(); // OK
f<omp_allocator_handle_t, omp_default_mem_alloc>(); // OK
g<omp_allocator_handle_t, const omp_alloctrait_t[]>(t, my); // 't'/traits not in the same scope
}
template<typename TH, TH alloc>
void f2()
{
#pragma omp target uses_allocators(alloc)
// { dg-error "allocator '\\(omp_allocator_handle_t\\)300' must be either a variable or a predefined allocator" "" { target *-*-* } .-1 }
;
}
template<typename TH, typename TT>
void g2(TH alloc)
{
TT t = {};
#pragma omp target uses_allocators(alloc(t))
;
}
void use2()
{
omp_allocator_handle_t my;
const omp_allocator_handle_t wrong = (omp_allocator_handle_t) 300;
f2<omp_allocator_handle_t, wrong>(); // 300 is not a predefined allocator
g2<omp_allocator_handle_t, const omp_alloctrait_t[]>(my); // OK
}