Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Assorted fixes for MSVC 2017 #341

Merged
merged 4 commits into from
Aug 18, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -60,17 +60,20 @@ static_assert(!cuda::std::indirectly_copyable<const MoveOnly*, MoveOnly*>);
static_assert(!cuda::std::indirectly_copyable<const MoveOnly*, const MoveOnly*>);

// Can copy copy-only objects.
#ifndef TEST_COMPILER_MSVC_2017 // MSVC2017 has issues determining common_reference
static_assert( cuda::std::indirectly_copyable<CopyOnly*, CopyOnly*>);
static_assert(!cuda::std::indirectly_copyable<CopyOnly*, const CopyOnly*>);
static_assert( cuda::std::indirectly_copyable<const CopyOnly*, CopyOnly*>);
static_assert(!cuda::std::indirectly_copyable<const CopyOnly*, const CopyOnly*>);
#endif // TEST_COMPILER_MSVC_2017

template<class T>
struct PointerTo {
using value_type = T;
__host__ __device__ T& operator*() const;
};

#ifndef TEST_COMPILER_MSVC_2017 // MSVC2017 has issues determining common_reference
// Can copy through a dereferenceable class.
static_assert( cuda::std::indirectly_copyable<int*, PointerTo<int>>);
static_assert(!cuda::std::indirectly_copyable<int*, PointerTo<const int>>);
Expand All @@ -79,6 +82,7 @@ static_assert(!cuda::std::indirectly_copyable<PointerTo<int>, PointerTo<const in
static_assert( cuda::std::indirectly_copyable<CopyOnly*, PointerTo<CopyOnly>>);
static_assert( cuda::std::indirectly_copyable<PointerTo<CopyOnly>, CopyOnly*>);
static_assert( cuda::std::indirectly_copyable<PointerTo<CopyOnly>, PointerTo<CopyOnly>>);
#endif // TEST_COMPILER_MSVC_2017

int main(int, char**)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,18 +41,21 @@ static_assert(!cuda::std::indirectly_movable<int(), int()>);
static_assert(!cuda::std::indirectly_movable<int*, int()>);
static_assert(!cuda::std::indirectly_movable<void, void>);

#ifndef TEST_COMPILER_MSVC_2017 // MSVC2017 has issues determining common_reference
// Can move move-only objects.
static_assert( cuda::std::indirectly_movable<MoveOnly*, MoveOnly*>);
static_assert(!cuda::std::indirectly_movable<MoveOnly*, const MoveOnly*>);
static_assert(!cuda::std::indirectly_movable<const MoveOnly*, const MoveOnly*>);
static_assert(!cuda::std::indirectly_movable<const MoveOnly*, MoveOnly*>);
#endif // TEST_COMPILER_MSVC_2017

template<class T>
struct PointerTo {
using value_type = T;
__host__ __device__ T& operator*() const;
};

#ifndef TEST_COMPILER_MSVC_2017 // MSVC2017 has issues determining common_reference
// Can copy through a dereferenceable class.
static_assert( cuda::std::indirectly_movable<int*, PointerTo<int>>);
static_assert(!cuda::std::indirectly_movable<int*, PointerTo<const int>>);
Expand All @@ -61,6 +64,7 @@ static_assert(!cuda::std::indirectly_copyable<PointerTo<int>, PointerTo<const in
static_assert( cuda::std::indirectly_movable<MoveOnly*, PointerTo<MoveOnly>>);
static_assert( cuda::std::indirectly_movable<PointerTo<MoveOnly>, MoveOnly*>);
static_assert( cuda::std::indirectly_movable<PointerTo<MoveOnly>, PointerTo<MoveOnly>>);
#endif // TEST_COMPILER_MSVC_2017

int main(int, char**)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,10 @@ static_assert(!cuda::std::indirectly_movable_storable<int*, const int*>);
static_assert(!cuda::std::indirectly_movable_storable<const int*, const int*>);
static_assert( cuda::std::indirectly_movable_storable<int*, int[2]>);
static_assert(!cuda::std::indirectly_movable_storable<int[2], int*>);
#ifndef TEST_COMPILER_MSVC_2017 // MSVC2017 has issues determining common_reference
static_assert( cuda::std::indirectly_movable_storable<MoveOnly*, MoveOnly*>);
static_assert( cuda::std::indirectly_movable_storable<PointerTo<MoveOnly>, PointerTo<MoveOnly>>);
#endif // TEST_COMPILER_MSVC_2017

// The dereference operator returns a different type from `value_type` and the reference type cannot be assigned from a
// `ValueType`.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#include <cuda/std/iterator>

#include "test_iterators.h"
#include "test_macros.h"

static_assert(cuda::std::input_iterator<cpp17_input_iterator<int*> >);
static_assert(cuda::std::input_iterator<cpp20_input_iterator<int*> >);
Expand All @@ -36,8 +37,10 @@ struct no_explicit_iter_concept {
__host__ __device__ no_explicit_iter_concept& operator++();
__host__ __device__ void operator++(int);
};
#ifndef TEST_COMPILER_MSVC_2017
// ITER-CONCEPT is `random_access_iterator_tag` >:(
static_assert(cuda::std::input_iterator<no_explicit_iter_concept>);
#endif // TEST_COMPILER_MSVC_2017

static_assert(cuda::std::input_iterator<int*>);
static_assert(cuda::std::input_iterator<int const*>);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#include <cuda/std/iterator>

#include "test_iterators.h"
#include "test_macros.h"

static_assert(!cuda::std::contiguous_iterator<cpp17_input_iterator<int*>>);
static_assert(!cuda::std::contiguous_iterator<cpp20_input_iterator<int*>>);
Expand All @@ -23,10 +24,12 @@ static_assert(!cuda::std::contiguous_iterator<bidirectional_iterator<int*>>);
static_assert(!cuda::std::contiguous_iterator<random_access_iterator<int*>>);
static_assert(cuda::std::contiguous_iterator<contiguous_iterator<int*>>);

#ifndef TEST_COMPILER_MSVC_2017
static_assert(cuda::std::contiguous_iterator<int*>);
static_assert(cuda::std::contiguous_iterator<int const*>);
static_assert(cuda::std::contiguous_iterator<int volatile*>);
static_assert(cuda::std::contiguous_iterator<int const volatile*>);
#endif // TEST_COMPILER_MSVC_2017

struct simple_contiguous_iterator {
typedef cuda::std::contiguous_iterator_tag iterator_category;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,12 @@ static_assert(!cuda::std::random_access_iterator<bidirectional_iterator<int*>>);
static_assert( cuda::std::random_access_iterator<random_access_iterator<int*>>);
static_assert( cuda::std::random_access_iterator<contiguous_iterator<int*>>);

#ifndef TEST_COMPILER_MSVC_2017
static_assert(cuda::std::random_access_iterator<int*>);
static_assert(cuda::std::random_access_iterator<int const*>);
static_assert(cuda::std::random_access_iterator<int volatile*>);
static_assert(cuda::std::random_access_iterator<int const volatile*>);
#endif // TEST_COMPILER_MSVC_2017

struct wrong_iterator_category {
typedef cuda::std::bidirectional_iterator_tag iterator_category;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@

#include <cuda/std/iterator>

#include "test_macros.h"

static_assert(cuda::std::sentinel_for<int*, int*>);
static_assert(!cuda::std::sentinel_for<int*, long*>);
struct nth_element_sentinel {
Expand Down Expand Up @@ -60,9 +62,12 @@ struct move_only_iterator {
__host__ __device__ bool operator==(move_only_iterator const&) const;
__host__ __device__ bool operator!=(move_only_iterator const&) const;
};

#ifndef TEST_COMPILER_MSVC_2017
static_assert(cuda::std::movable<move_only_iterator> && !cuda::std::copyable<move_only_iterator> &&
cuda::std::input_or_output_iterator<move_only_iterator> &&
!cuda::std::sentinel_for<move_only_iterator, move_only_iterator>);
#endif // TEST_COMPILER_MSVC_2017

int main(int, char**)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,9 +66,11 @@ static_assert(cuda::std::weakly_incrementable<not_default_initializable>);
static_assert(cuda::std::weakly_incrementable<incrementable_with_difference_type>);
static_assert(cuda::std::weakly_incrementable<incrementable_without_difference_type>);
static_assert(cuda::std::weakly_incrementable<difference_type_and_void_minus>);
#ifndef TEST_COMPILER_MSVC_2017
static_assert(cuda::std::weakly_incrementable<noncopyable_with_difference_type>);
static_assert(cuda::std::weakly_incrementable<noncopyable_without_difference_type>);
static_assert(cuda::std::weakly_incrementable<noncopyable_with_difference_type_and_minus>);
#endif // TEST_COMPILER_MSVC_2017

int main(int, char**)
{
Expand Down
15 changes: 9 additions & 6 deletions libcudacxx/.upstream-tests/test/support/test_iterators.h
Original file line number Diff line number Diff line change
Expand Up @@ -233,11 +233,11 @@ class random_access_iterator
#if TEST_STD_VER > 14
static_assert(cuda::std::random_access_iterator<random_access_iterator<int*>>, "");

template <class It, class = cuda::std::enable_if_t<cuda::std::random_access_iterator<It>>>
template <class It>
class cpp20_random_access_iterator {
It it_;

template <class U, class>
template <class U>
friend class cpp20_random_access_iterator;

public:
Expand Down Expand Up @@ -609,8 +609,12 @@ class cpp20_input_iterator
using iterator_concept = cuda::std::input_iterator_tag;

__host__ __device__ constexpr explicit cpp20_input_iterator(It it) : it_(it) {}

#ifndef TEST_COMPILER_MSVC_2017 // MSVC2017 has issues determining common_reference
cpp20_input_iterator(cpp20_input_iterator&&) = default;
cpp20_input_iterator& operator=(cpp20_input_iterator&&) = default;
#endif // !TEST_COMPILER_MSVC_2017

__host__ __device__ constexpr decltype(auto) operator*() const { return *it_; }
__host__ __device__ constexpr cpp20_input_iterator& operator++() { ++it_; return *this; }
__host__ __device__ constexpr void operator++(int) { ++it_; }
Expand Down Expand Up @@ -643,8 +647,11 @@ class cpp20_output_iterator {
using difference_type = cuda::std::iter_difference_t<It>;

__host__ __device__ constexpr explicit cpp20_output_iterator(It it) : it_(it) {}

#ifndef TEST_COMPILER_MSVC_2017 // MSVC2017 has issues determining common_reference
cpp20_output_iterator(cpp20_output_iterator&&) = default;
cpp20_output_iterator& operator=(cpp20_output_iterator&&) = default;
#endif // !TEST_COMPILER_MSVC_2017

__host__ __device__ constexpr decltype(auto) operator*() const { return *it_; }
__host__ __device__ constexpr cpp20_output_iterator& operator++() {
Expand Down Expand Up @@ -1032,10 +1039,6 @@ TEST_NV_DIAG_SUPPRESS(1805) // MSVC complains that if we pass a pointer type, ad
return *this;
}

#if defined(TEST_COMPILER_MSVC)
TEST_NV_DIAG_DEFAULT(1805)
#endif // TEST_COMPILER_MSVC

// If `T` is a reference type, the implicitly-generated assignment operator will be deleted (and would take precedence
// over the templated `operator=` above because it's a better match).
__host__ __device__ constexpr Proxy& operator=(const Proxy& rhs) {
Expand Down
Loading
Loading