blob: 49425386b33f6220a972b59594c96f7fe1f72a94 [file] [log] [blame]
// { dg-do run }
#include <omp.h>
#include <memory>
#include <limits>
template<typename T, template<typename> class Alloc>
void test (T const initial_value = T())
{
using Allocator = Alloc<T>;
Allocator a;
using Traits = std::allocator_traits<Allocator>;
static_assert (__is_same(typename Traits::allocator_type, Allocator ));
static_assert (__is_same(typename Traits::value_type, T ));
static_assert (__is_same(typename Traits::pointer, T* ));
static_assert (__is_same(typename Traits::const_pointer, T const* ));
static_assert (__is_same(typename Traits::void_pointer, void* ));
static_assert (__is_same(typename Traits::const_void_pointer, void const* ));
static_assert (__is_same(typename Traits::difference_type, __PTRDIFF_TYPE__));
static_assert (__is_same(typename Traits::size_type, __SIZE_TYPE__ ));
static_assert (Traits::propagate_on_container_copy_assignment::value == false);
static_assert (Traits::propagate_on_container_move_assignment::value == false);
static_assert (Traits::propagate_on_container_swap::value == false);
static_assert (Traits::is_always_equal::value == true);
static constexpr __SIZE_TYPE__ correct_max_size
= std::numeric_limits<__SIZE_TYPE__>::max () / sizeof (T);
if (Traits::max_size (a) != correct_max_size)
__builtin_abort ();
static constexpr __SIZE_TYPE__ alloc_count = 1;
T *p = Traits::allocate (a, alloc_count);
if (p == nullptr)
__builtin_abort ();
Traits::construct (a, p, initial_value);
if (*p != initial_value)
__builtin_abort ();
Traits::destroy (a, p);
Traits::deallocate (a, p, alloc_count);
/* Not interesting but might as well test it. */
static_cast<void>(Traits::select_on_container_copy_construction (a));
if (!(a == Allocator()))
__builtin_abort ();
if (a != Allocator())
__builtin_abort ();
if (!(a == Alloc<void>()))
__builtin_abort ();
if (a != Alloc<void>())
__builtin_abort ();
}
#define CHECK_INEQUALITY(other_alloc_templ, type) \
do { \
/* Skip tests for itself, those are equal. Intantiate each */ \
/* one with void so we can easily tell if they are the same. */ \
if (!__is_same (AllocTempl<void>, other_alloc_templ<void>)) \
{ \
other_alloc_templ<type> other; \
if (a == other) \
__builtin_abort (); \
if (!(a != other)) \
__builtin_abort (); \
} \
} while (false)
template<typename T, template<typename> class AllocTempl>
void test_inequality ()
{
using Allocator = AllocTempl<T>;
Allocator a;
CHECK_INEQUALITY (omp::allocator::null_allocator, void);
CHECK_INEQUALITY (omp::allocator::default_mem, void);
CHECK_INEQUALITY (omp::allocator::large_cap_mem, void);
CHECK_INEQUALITY (omp::allocator::const_mem, void);
CHECK_INEQUALITY (omp::allocator::high_bw_mem, void);
CHECK_INEQUALITY (omp::allocator::low_lat_mem, void);
CHECK_INEQUALITY (omp::allocator::cgroup_mem, void);
CHECK_INEQUALITY (omp::allocator::pteam_mem, void);
CHECK_INEQUALITY (omp::allocator::thread_mem, void);
#ifdef __gnu_linux__
/* Pinning not implemented on other targets. */
CHECK_INEQUALITY (ompx::allocator::gnu_pinned_mem, void);
#endif
/* And again with the same type passed to the allocator. */
CHECK_INEQUALITY (omp::allocator::null_allocator, T);
CHECK_INEQUALITY (omp::allocator::default_mem, T);
CHECK_INEQUALITY (omp::allocator::large_cap_mem, T);
CHECK_INEQUALITY (omp::allocator::const_mem, T);
CHECK_INEQUALITY (omp::allocator::high_bw_mem, T);
CHECK_INEQUALITY (omp::allocator::low_lat_mem, T);
CHECK_INEQUALITY (omp::allocator::cgroup_mem, T);
CHECK_INEQUALITY (omp::allocator::pteam_mem, T);
CHECK_INEQUALITY (omp::allocator::thread_mem, T);
#ifdef __gnu_linux__
CHECK_INEQUALITY (ompx::allocator::gnu_pinned_mem, T);
#endif
}
#undef CHECK_INEQUALITY
struct S
{
int _v0;
bool _v1;
float _v2;
bool operator== (S const& other) const noexcept {
return _v0 == other._v0
&& _v1 == other._v1
&& _v2 == other._v2;
}
bool operator!= (S const& other) const noexcept {
return !this->operator==(other);
}
};
int main ()
{
test<int, omp::allocator::null_allocator>(42);
test<int, omp::allocator::default_mem>(42);
test<int, omp::allocator::large_cap_mem>(42);
test<int, omp::allocator::const_mem>(42);
test<int, omp::allocator::high_bw_mem>(42);
test<int, omp::allocator::low_lat_mem>(42);
test<int, omp::allocator::cgroup_mem>(42);
test<int, omp::allocator::pteam_mem>(42);
test<int, omp::allocator::thread_mem>(42);
#ifdef __gnu_linux__
test<int, ompx::allocator::gnu_pinned_mem>(42);
#endif
test<long long, omp::allocator::null_allocator>(42);
test<long long, omp::allocator::default_mem>(42);
test<long long, omp::allocator::large_cap_mem>(42);
test<long long, omp::allocator::const_mem>(42);
test<long long, omp::allocator::high_bw_mem>(42);
test<long long, omp::allocator::low_lat_mem>(42);
test<long long, omp::allocator::cgroup_mem>(42);
test<long long, omp::allocator::pteam_mem>(42);
test<long long, omp::allocator::thread_mem>(42);
#ifdef __gnu_linux__
test<long long, ompx::allocator::gnu_pinned_mem>(42);
#endif
test<S, omp::allocator::null_allocator>( S{42, true, 128.f});
test<S, omp::allocator::default_mem>( S{42, true, 128.f});
test<S, omp::allocator::large_cap_mem>( S{42, true, 128.f});
test<S, omp::allocator::const_mem>( S{42, true, 128.f});
test<S, omp::allocator::high_bw_mem>( S{42, true, 128.f});
test<S, omp::allocator::low_lat_mem>( S{42, true, 128.f});
test<S, omp::allocator::cgroup_mem>( S{42, true, 128.f});
test<S, omp::allocator::pteam_mem>( S{42, true, 128.f});
test<S, omp::allocator::thread_mem>( S{42, true, 128.f});
#ifdef __gnu_linux__
test<S, ompx::allocator::gnu_pinned_mem>(S{42, true, 128.f});
#endif
test_inequality<int, omp::allocator::null_allocator>();
test_inequality<int, omp::allocator::default_mem>();
test_inequality<int, omp::allocator::large_cap_mem>();
test_inequality<int, omp::allocator::const_mem>();
test_inequality<int, omp::allocator::high_bw_mem>();
test_inequality<int, omp::allocator::low_lat_mem>();
test_inequality<int, omp::allocator::cgroup_mem>();
test_inequality<int, omp::allocator::pteam_mem>();
test_inequality<int, omp::allocator::thread_mem>();
#ifdef __gnu_linux__
test_inequality<int, ompx::allocator::gnu_pinned_mem>();
#endif
}