| // { 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 |
| } |