From 2f2d1e42dcb0ef1b0fc7200d090b40cf86da47c6 Mon Sep 17 00:00:00 2001 From: Jakub Mazurkiewicz Date: Thu, 4 May 2023 17:46:54 +0200 Subject: [PATCH 1/5] Improve tests --- stl/inc/mdspan | 6 ++-- .../tests/P0009R18_mdspan_extents/test.cpp | 22 ++++++++---- .../P0009R18_mdspan_layout_left/test.cpp | 14 ++++++-- .../P0009R18_mdspan_layout_right/test.cpp | 16 +++++++-- .../P0009R18_mdspan_layout_stride/test.cpp | 35 +++++++++++++------ 5 files changed, 68 insertions(+), 25 deletions(-) diff --git a/stl/inc/mdspan b/stl/inc/mdspan index ff1766909f1..638943cb4cb 100644 --- a/stl/inc/mdspan +++ b/stl/inc/mdspan @@ -601,7 +601,7 @@ public: _Strides.back() = 1; for (rank_type _Idx = extents_type::_Rank - 1; _Idx-- > 0;) { // TRANSITION USE `_Multiply_with_overflow_check` IN DEBUG MODE - _Strides[_Idx] = _Strides[_Idx + 1] * _Exts.extent(_Idx + 1); + _Strides[_Idx] = static_cast(_Strides[_Idx + 1] * _Exts.extent(_Idx + 1)); } } } @@ -752,7 +752,7 @@ public: } for (rank_type _Idx = 0; _Idx < extents_type::_Rank; ++_Idx) { - if (_Left.stride(_Idx) != _Right.stride(_Idx)) { + if (_STD cmp_not_equal(_Left.stride(_Idx), _Right.stride(_Idx))) { return false; } } @@ -786,7 +786,7 @@ private: template _NODISCARD constexpr index_type _Index_impl(index_sequence<_Seq...>, _IndexTypes... _Indices) const noexcept { _STL_INTERNAL_STATIC_ASSERT((same_as<_IndexTypes, index_type> && ...)); - return ((_Indices * _Strides[_Seq]) + ... + 0); + return static_cast(((_Indices * _Strides[_Seq]) + ... + 0)); } }; diff --git a/tests/std/tests/P0009R18_mdspan_extents/test.cpp b/tests/std/tests/P0009R18_mdspan_extents/test.cpp index 83cf926a70a..631e28f3917 100644 --- a/tests/std/tests/P0009R18_mdspan_extents/test.cpp +++ b/tests/std/tests/P0009R18_mdspan_extents/test.cpp @@ -292,16 +292,26 @@ constexpr void check_equality_operator() { } constexpr bool test() { - check_members(); - check_members(); - check_members(); - check_members(); - check_members(); - check_members(); + // Check signed integers + check_members(); + check_members(); + check_members(); + check_members(); + check_members(); + + // Check unsigned integers + check_members(); + check_members(); + check_members(); + check_members(); + check_members(); + + // Other checks check_construction_from_other_extents(); check_construction_from_extents_pack(); check_construction_from_array_and_span(); check_equality_operator(); + return true; } diff --git a/tests/std/tests/P0009R18_mdspan_layout_left/test.cpp b/tests/std/tests/P0009R18_mdspan_layout_left/test.cpp index 4322e1c8648..f0b42e8bb5b 100644 --- a/tests/std/tests/P0009R18_mdspan_layout_left/test.cpp +++ b/tests/std/tests/P0009R18_mdspan_layout_left/test.cpp @@ -356,18 +356,28 @@ constexpr void check_correctness() { } constexpr bool test() { + // Check signed integers + check_members(extents{5}); check_members(extents{}); check_members(extents{}); + check_members(extents{4, 5}); + check_members(extents{4, 5}); + + // Check unsigned integers + check_members(extents{3, 3, 3}); check_members(extents{}); + check_members(extents{4, 4}); + check_members(extents{1, 2, 3}); check_members(extents{3}); - check_members(extents{4, 5}); - check_members(extents{3, 3, 3}); + + // Other checks check_construction_from_other_left_mapping(); check_construction_from_other_right_mapping(); check_construction_from_other_stride_mapping(); check_call_operator(); check_comparisons(); check_correctness(); + return true; } diff --git a/tests/std/tests/P0009R18_mdspan_layout_right/test.cpp b/tests/std/tests/P0009R18_mdspan_layout_right/test.cpp index 4810d8a3621..4e73895a877 100644 --- a/tests/std/tests/P0009R18_mdspan_layout_right/test.cpp +++ b/tests/std/tests/P0009R18_mdspan_layout_right/test.cpp @@ -367,18 +367,28 @@ constexpr void check_correctness() { } constexpr bool test() { - check_members(extents{}); + // Check signed integers + check_members(extents{}); + check_members(extents{4, 5}); check_members(extents{}); + check_members(extents{3, 2, 1}); + check_members(extents{4}); + + // Check unsigned integers + check_members(extents{3, 3, 3}); check_members(extents{}); + check_members(extents{7, 5, 3}); + check_members(extents{3}); check_members(extents{3}); - check_members(extents{4, 5}); - check_members(extents{3, 3, 3}); + + // Other checks check_construction_from_other_right_mapping(); check_construction_from_other_left_mapping(); check_construction_from_other_stride_mapping(); check_call_operator(); check_comparisons(); check_correctness(); + return true; } diff --git a/tests/std/tests/P0009R18_mdspan_layout_stride/test.cpp b/tests/std/tests/P0009R18_mdspan_layout_stride/test.cpp index 960c7fe4e69..4dc457e1f70 100644 --- a/tests/std/tests/P0009R18_mdspan_layout_stride/test.cpp +++ b/tests/std/tests/P0009R18_mdspan_layout_stride/test.cpp @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +#include #include #include #include @@ -13,9 +14,9 @@ using namespace std; -template +template constexpr void do_check_members(const extents& ext, - const array& strs, index_sequence) { + const array& strs, index_sequence) { using Ext = extents; using Strides = array; using Mapping = layout_stride::mapping; @@ -50,16 +51,16 @@ constexpr void do_check_members(const extents& ext, { // Check construction from extents_type and array Mapping m{ext, strs}; assert(m.extents() == ext); - assert(m.strides() == strs); + assert(ranges::equal(m.strides(), strs)); static_assert(is_nothrow_constructible_v); // Other tests are defined in 'check_construction_from_extents_and_array' function [FIXME] } { // Check construction from extents_type and span - using Span = span; + using Span = span; Mapping m{ext, Span{strs}}; assert(m.extents() == ext); - assert(m.strides() == strs); + assert(ranges::equal(m.strides(), strs)); static_assert(is_nothrow_constructible_v); // Other tests are defined in 'check_construction_from_extents_and_array' function [FIXME] } @@ -86,7 +87,7 @@ constexpr void do_check_members(const extents& ext, { // Check 'strides' function same_as decltype(auto) strs2 = m.strides(); - assert(strs2 == strs); + assert(ranges::equal(strs2, strs)); static_assert(noexcept(m.strides())); } @@ -131,15 +132,27 @@ constexpr void do_check_members(const extents& ext, #pragma warning(pop) // TRANSITION, "/analyze:only" BUG? } -template -constexpr void check_members(extents ext, const array& strides) { - do_check_members(ext, strides, make_index_sequence{}); +template +constexpr void check_members( + extents ext, const array& strides) { + do_check_members(ext, strides, make_index_sequence{}); } constexpr bool test() { - check_members(extents{}, array{}); - check_members(extents{}, array{1}); + // Check signed integers + check_members(extents{5}, array{1}); + check_members(extents{}, array{1, 6}); check_members(extents{3}, array{1, 3}); + check_members(extents{}, array{1}); + check_members(extents{3}, array{1, 3, 6}); + + // Check unsigned integers + check_members(extents{5}, array{1}); + check_members(extents{}, array{1, 6}); + check_members(extents{3}, array{1, 3}); + check_members(extents{}, array{1}); + check_members(extents{3}, array{1, 3, 6}); + // TRANSITION more tests return true; } From 9b7ead97e70c0a281d60bc4856359948cd1ec1e1 Mon Sep 17 00:00:00 2001 From: Jakub Mazurkiewicz Date: Fri, 5 May 2023 12:21:58 +0200 Subject: [PATCH 2/5] Improve `layout_stride` tests --- .../P0009R18_mdspan_layout_stride/test.cpp | 60 +++++++++++++------ 1 file changed, 43 insertions(+), 17 deletions(-) diff --git a/tests/std/tests/P0009R18_mdspan_layout_stride/test.cpp b/tests/std/tests/P0009R18_mdspan_layout_stride/test.cpp index 4dc457e1f70..b621180bcd6 100644 --- a/tests/std/tests/P0009R18_mdspan_layout_stride/test.cpp +++ b/tests/std/tests/P0009R18_mdspan_layout_stride/test.cpp @@ -14,6 +14,13 @@ using namespace std; +struct CmpEqual { + template + constexpr bool operator()(T t, U u) { + return cmp_equal(t, u); + } +}; + template constexpr void do_check_members(const extents& ext, const array& strs, index_sequence) { @@ -51,7 +58,7 @@ constexpr void do_check_members(const extents& ext, { // Check construction from extents_type and array Mapping m{ext, strs}; assert(m.extents() == ext); - assert(ranges::equal(m.strides(), strs)); + assert(ranges::equal(m.strides(), strs, CmpEqual{})); static_assert(is_nothrow_constructible_v); // Other tests are defined in 'check_construction_from_extents_and_array' function [FIXME] } @@ -60,7 +67,7 @@ constexpr void do_check_members(const extents& ext, using Span = span; Mapping m{ext, Span{strs}}; assert(m.extents() == ext); - assert(ranges::equal(m.strides(), strs)); + assert(ranges::equal(m.strides(), strs, CmpEqual{})); static_assert(is_nothrow_constructible_v); // Other tests are defined in 'check_construction_from_extents_and_array' function [FIXME] } @@ -87,7 +94,7 @@ constexpr void do_check_members(const extents& ext, { // Check 'strides' function same_as decltype(auto) strs2 = m.strides(); - assert(ranges::equal(strs2, strs)); + assert(ranges::equal(strs2, strs, CmpEqual{})); static_assert(noexcept(m.strides())); } @@ -120,7 +127,7 @@ constexpr void do_check_members(const extents& ext, { // Check 'stride' function for (size_t i = 0; i < strs.size(); ++i) { same_as decltype(auto) s = m.stride(i); - assert(strs[i] == s); + assert(cmp_equal(strs[i], s)); } } @@ -132,26 +139,45 @@ constexpr void do_check_members(const extents& ext, #pragma warning(pop) // TRANSITION, "/analyze:only" BUG? } -template -constexpr void check_members( - extents ext, const array& strides) { - do_check_members(ext, strides, make_index_sequence{}); +template +constexpr void check_members_with_different_strides_index_type( + extents ext, const array& strides) { + array test_strides; + ranges::transform(strides, test_strides.begin(), [](auto i) { return static_cast(i); }); + do_check_members(ext, test_strides, make_index_sequence{}); +} + +template +constexpr void check_members(extents ext, const array& strides) { + // Check signed strides + check_members_with_different_strides_index_type(ext, strides); + check_members_with_different_strides_index_type(ext, strides); + check_members_with_different_strides_index_type(ext, strides); + check_members_with_different_strides_index_type(ext, strides); + check_members_with_different_strides_index_type(ext, strides); + + // Check unsigned strides + check_members_with_different_strides_index_type(ext, strides); + check_members_with_different_strides_index_type(ext, strides); + check_members_with_different_strides_index_type(ext, strides); + check_members_with_different_strides_index_type(ext, strides); + check_members_with_different_strides_index_type(ext, strides); } constexpr bool test() { // Check signed integers - check_members(extents{5}, array{1}); - check_members(extents{}, array{1, 6}); + check_members(extents{5}, array{1}); + check_members(extents{}, array{1, 6}); check_members(extents{3}, array{1, 3}); - check_members(extents{}, array{1}); - check_members(extents{3}, array{1, 3, 6}); + check_members(extents{}, array{1}); + check_members(extents{3}, array{1, 3, 6}); // Check unsigned integers - check_members(extents{5}, array{1}); - check_members(extents{}, array{1, 6}); - check_members(extents{3}, array{1, 3}); - check_members(extents{}, array{1}); - check_members(extents{3}, array{1, 3, 6}); + check_members(extents{5}, array{1}); + check_members(extents{}, array{1, 6}); + check_members(extents{3}, array{1, 3}); + check_members(extents{}, array{1}); + check_members(extents{3}, array{1, 3, 6}); // TRANSITION more tests return true; From 37c64596bae0e5e90dbc385b690139c7d254caf2 Mon Sep 17 00:00:00 2001 From: Jakub Mazurkiewicz Date: Fri, 5 May 2023 14:05:23 +0200 Subject: [PATCH 3/5] Even more complex tests --- tests/std/include/test_mdspan_support.hpp | 64 +++++++++++++++++++ .../tests/P0009R18_mdspan_extents/test.cpp | 25 ++------ .../P0009R18_mdspan_layout_left/test.cpp | 26 ++------ .../P0009R18_mdspan_layout_right/test.cpp | 29 +++------ .../P0009R18_mdspan_layout_stride/test.cpp | 20 +++--- 5 files changed, 91 insertions(+), 73 deletions(-) diff --git a/tests/std/include/test_mdspan_support.hpp b/tests/std/include/test_mdspan_support.hpp index 842065b9051..5eca8dee652 100644 --- a/tests/std/include/test_mdspan_support.hpp +++ b/tests/std/include/test_mdspan_support.hpp @@ -3,9 +3,11 @@ #pragma once +#include #include #include #include +#include #include #include @@ -156,3 +158,65 @@ constexpr bool check_accessor_policy_requirements() { static_assert(detail::CheckMemberFunctionsOfAccessorPolicy); return true; } + +namespace details { + template + constexpr void check_members_with_mixed_extents(TestFn&& fn) { + auto select_extent = [](size_t e) consteval { + return e == std::dynamic_extent ? std::min(sizeof...(Extents), 3) : e; + }; + + // Check signed integers + fn(std::extents{select_extent(Extents)...}); + fn(std::extents{select_extent(Extents)...}); + fn(std::extents{select_extent(Extents)...}); + fn(std::extents{select_extent(Extents)...}); + fn(std::extents{select_extent(Extents)...}); + + // Check unsigned integers + fn(std::extents{select_extent(Extents)...}); + fn(std::extents{select_extent(Extents)...}); + fn(std::extents{select_extent(Extents)...}); + fn(std::extents{select_extent(Extents)...}); + fn(std::extents{select_extent(Extents)...}); + } + + template + constexpr void check_members_with_various_extents_impl(TestFn&& fn, std::index_sequence) { + auto static_or_dynamic = [](size_t i) consteval { + return i == 0 ? std::dynamic_extent : std::min(sizeof...(Seq), 3); + }; + + // Check with mixed Extents + if constexpr (sizeof...(Seq) <= 1) { + check_members_with_mixed_extents<>(std::forward(fn)); + } else if constexpr (sizeof...(Seq) <= 2) { + (check_members_with_mixed_extents(std::forward(fn)), ...); + } else if constexpr (sizeof...(Seq) <= 4) { + (check_members_with_mixed_extents( + std::forward(fn)), + ...); + } else if constexpr (sizeof...(Seq) <= 8) { + (check_members_with_mixed_extents(std::forward(fn)), + ...); + } else if constexpr (sizeof...(Seq) <= 16) { + (check_members_with_mixed_extents(std::forward(fn)), + ...); + } else { + static_assert(sizeof...(Seq) <= 16, "We don't need more testing."); + } + } +} // namespace details + +template +constexpr void check_members_with_various_extents(TestFn&& fn) { + details::check_members_with_various_extents_impl(std::forward(fn), std::make_index_sequence<1>{}); + details::check_members_with_various_extents_impl(std::forward(fn), std::make_index_sequence<2>{}); + details::check_members_with_various_extents_impl(std::forward(fn), std::make_index_sequence<4>{}); + details::check_members_with_various_extents_impl(std::forward(fn), std::make_index_sequence<8>{}); +#if _PREFAST_ == 0 + details::check_members_with_various_extents_impl(std::forward(fn), std::make_index_sequence<16>{}); +#endif // _PREFAST_ == 0 +} diff --git a/tests/std/tests/P0009R18_mdspan_extents/test.cpp b/tests/std/tests/P0009R18_mdspan_extents/test.cpp index 631e28f3917..e7fa0109883 100644 --- a/tests/std/tests/P0009R18_mdspan_extents/test.cpp +++ b/tests/std/tests/P0009R18_mdspan_extents/test.cpp @@ -15,7 +15,7 @@ using namespace std; template -constexpr void do_check_members(index_sequence) { +constexpr void check_members(index_sequence) { using Ext = extents; // Each specialization of extents models regular and is trivially copyable @@ -80,11 +80,6 @@ constexpr void do_check_members(index_sequence) { } } -template -constexpr void check_members() { - do_check_members(make_index_sequence{}); -} - constexpr void check_construction_from_other_extents() { { // Check construction from too big or too small other extents using Ext = extents; @@ -292,21 +287,9 @@ constexpr void check_equality_operator() { } constexpr bool test() { - // Check signed integers - check_members(); - check_members(); - check_members(); - check_members(); - check_members(); - - // Check unsigned integers - check_members(); - check_members(); - check_members(); - check_members(); - check_members(); - - // Other checks + check_members_with_various_extents([](const extents&) { + check_members(make_index_sequence{}); + }); check_construction_from_other_extents(); check_construction_from_extents_pack(); check_construction_from_array_and_span(); diff --git a/tests/std/tests/P0009R18_mdspan_layout_left/test.cpp b/tests/std/tests/P0009R18_mdspan_layout_left/test.cpp index f0b42e8bb5b..fdae36b7555 100644 --- a/tests/std/tests/P0009R18_mdspan_layout_left/test.cpp +++ b/tests/std/tests/P0009R18_mdspan_layout_left/test.cpp @@ -14,7 +14,7 @@ using namespace std; template -constexpr void do_check_members(const extents& ext, index_sequence) { +constexpr void check_members(const extents& ext, index_sequence) { using Ext = extents; using Mapping = layout_left::mapping; @@ -144,11 +144,6 @@ constexpr void do_check_members(const extents& ext, index } } -template -constexpr void check_members(extents ext) { - do_check_members(ext, make_index_sequence{}); -} - constexpr void check_construction_from_other_left_mapping() { { // Check invalid construction using Mapping = layout_left::mapping>; @@ -356,21 +351,10 @@ constexpr void check_correctness() { } constexpr bool test() { - // Check signed integers - check_members(extents{5}); - check_members(extents{}); - check_members(extents{}); - check_members(extents{4, 5}); - check_members(extents{4, 5}); - - // Check unsigned integers - check_members(extents{3, 3, 3}); - check_members(extents{}); - check_members(extents{4, 4}); - check_members(extents{1, 2, 3}); - check_members(extents{3}); - - // Other checks + check_members_with_various_extents( + [](const extents& ext) { + check_members(ext, make_index_sequence{}); + }); check_construction_from_other_left_mapping(); check_construction_from_other_right_mapping(); check_construction_from_other_stride_mapping(); diff --git a/tests/std/tests/P0009R18_mdspan_layout_right/test.cpp b/tests/std/tests/P0009R18_mdspan_layout_right/test.cpp index 4e73895a877..64f2e77f2ca 100644 --- a/tests/std/tests/P0009R18_mdspan_layout_right/test.cpp +++ b/tests/std/tests/P0009R18_mdspan_layout_right/test.cpp @@ -14,7 +14,7 @@ using namespace std; template -constexpr void do_check_members(const extents& ext, index_sequence) { +constexpr void check_members(const extents& ext, index_sequence) { using Ext = extents; using Mapping = layout_right::mapping; @@ -51,6 +51,8 @@ constexpr void do_check_members(const extents& ext, index using Ext2 = extents; using Mapping2 = layout_right::mapping; +#pragma warning(push) // TRANSITION, "/analyze:only" BUG? +#pragma warning(disable : 28020) // The expression '0<=_Param_(1)&&_Param_(1)<=1-1' is not true at this call { // Check construction from other layout_right::mapping Mapping m1{ext}; Mapping2 m2{m1}; @@ -138,11 +140,7 @@ constexpr void do_check_members(const extents& ext, index assert(!(m != m)); // Other tests are defined in 'check_comparisons' function } -} - -template -constexpr void check_members(extents ext) { - do_check_members(ext, make_index_sequence{}); +#pragma warning(pop) // TRANSITION, "/analyze:only" BUG? } constexpr void check_construction_from_other_right_mapping() { @@ -367,21 +365,10 @@ constexpr void check_correctness() { } constexpr bool test() { - // Check signed integers - check_members(extents{}); - check_members(extents{4, 5}); - check_members(extents{}); - check_members(extents{3, 2, 1}); - check_members(extents{4}); - - // Check unsigned integers - check_members(extents{3, 3, 3}); - check_members(extents{}); - check_members(extents{7, 5, 3}); - check_members(extents{3}); - check_members(extents{3}); - - // Other checks + check_members_with_various_extents( + [](const extents& ext) { + check_members(ext, make_index_sequence{}); + }); check_construction_from_other_right_mapping(); check_construction_from_other_left_mapping(); check_construction_from_other_stride_mapping(); diff --git a/tests/std/tests/P0009R18_mdspan_layout_stride/test.cpp b/tests/std/tests/P0009R18_mdspan_layout_stride/test.cpp index b621180bcd6..fa6733dfaa6 100644 --- a/tests/std/tests/P0009R18_mdspan_layout_stride/test.cpp +++ b/tests/std/tests/P0009R18_mdspan_layout_stride/test.cpp @@ -166,18 +166,18 @@ constexpr void check_members(extents ext, const array{5}, array{1}); - check_members(extents{}, array{1, 6}); - check_members(extents{3}, array{1, 3}); - check_members(extents{}, array{1}); - check_members(extents{3}, array{1, 3, 6}); + check_members(extents{5}, array{1}); + check_members(extents{}, array{1, 6}); + check_members(extents{3}, array{1, 3}); + check_members(extents{}, array{1}); + check_members(extents{3}, array{1, 3, 6}); // Check unsigned integers - check_members(extents{5}, array{1}); - check_members(extents{}, array{1, 6}); - check_members(extents{3}, array{1, 3}); - check_members(extents{}, array{1}); - check_members(extents{3}, array{1, 3, 6}); + check_members(extents{5}, array{1}); + check_members(extents{}, array{1, 6}); + check_members(extents{3}, array{1, 3}); + check_members(extents{}, array{1}); + check_members(extents{3}, array{1, 3, 6}); // TRANSITION more tests return true; From 1a7c3a3b971666fcbcca80dc67992b7eeb39a9fd Mon Sep 17 00:00:00 2001 From: Jakub Mazurkiewicz Date: Fri, 5 May 2023 18:48:17 +0200 Subject: [PATCH 4/5] Nitpicks --- tests/std/include/test_mdspan_support.hpp | 33 +++++++++---------- .../P0009R18_mdspan_layout_stride/test.cpp | 2 +- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/tests/std/include/test_mdspan_support.hpp b/tests/std/include/test_mdspan_support.hpp index 5eca8dee652..301e9d63b68 100644 --- a/tests/std/include/test_mdspan_support.hpp +++ b/tests/std/include/test_mdspan_support.hpp @@ -160,8 +160,8 @@ constexpr bool check_accessor_policy_requirements() { } namespace details { - template - constexpr void check_members_with_mixed_extents(TestFn&& fn) { + template + constexpr void check_members_with_mixed_extents(Fn&& fn) { auto select_extent = [](size_t e) consteval { return e == std::dynamic_extent ? std::min(sizeof...(Extents), 3) : e; }; @@ -181,28 +181,27 @@ namespace details { fn(std::extents{select_extent(Extents)...}); } - template - constexpr void check_members_with_various_extents_impl(TestFn&& fn, std::index_sequence) { + template + constexpr void check_members_with_various_extents_impl(Fn&& fn, std::index_sequence) { auto static_or_dynamic = [](size_t i) consteval { return i == 0 ? std::dynamic_extent : std::min(sizeof...(Seq), 3); }; - // Check with mixed Extents if constexpr (sizeof...(Seq) <= 1) { - check_members_with_mixed_extents<>(std::forward(fn)); + check_members_with_mixed_extents<>(std::forward(fn)); } else if constexpr (sizeof...(Seq) <= 2) { - (check_members_with_mixed_extents(std::forward(fn)), ...); + (check_members_with_mixed_extents(std::forward(fn)), ...); } else if constexpr (sizeof...(Seq) <= 4) { (check_members_with_mixed_extents( - std::forward(fn)), + std::forward(fn)), ...); } else if constexpr (sizeof...(Seq) <= 8) { (check_members_with_mixed_extents(std::forward(fn)), + static_or_dynamic(Seq & 0x1)>(std::forward(fn)), ...); } else if constexpr (sizeof...(Seq) <= 16) { (check_members_with_mixed_extents(std::forward(fn)), + static_or_dynamic(Seq & 0x2), static_or_dynamic(Seq & 0x1)>(std::forward(fn)), ...); } else { static_assert(sizeof...(Seq) <= 16, "We don't need more testing."); @@ -210,13 +209,13 @@ namespace details { } } // namespace details -template -constexpr void check_members_with_various_extents(TestFn&& fn) { - details::check_members_with_various_extents_impl(std::forward(fn), std::make_index_sequence<1>{}); - details::check_members_with_various_extents_impl(std::forward(fn), std::make_index_sequence<2>{}); - details::check_members_with_various_extents_impl(std::forward(fn), std::make_index_sequence<4>{}); - details::check_members_with_various_extents_impl(std::forward(fn), std::make_index_sequence<8>{}); +template +constexpr void check_members_with_various_extents(Fn&& fn) { + details::check_members_with_various_extents_impl(std::forward(fn), std::make_index_sequence<1>{}); + details::check_members_with_various_extents_impl(std::forward(fn), std::make_index_sequence<2>{}); + details::check_members_with_various_extents_impl(std::forward(fn), std::make_index_sequence<4>{}); + details::check_members_with_various_extents_impl(std::forward(fn), std::make_index_sequence<8>{}); #if _PREFAST_ == 0 - details::check_members_with_various_extents_impl(std::forward(fn), std::make_index_sequence<16>{}); + details::check_members_with_various_extents_impl(std::forward(fn), std::make_index_sequence<16>{}); #endif // _PREFAST_ == 0 } diff --git a/tests/std/tests/P0009R18_mdspan_layout_stride/test.cpp b/tests/std/tests/P0009R18_mdspan_layout_stride/test.cpp index fa6733dfaa6..0a2f8bfc796 100644 --- a/tests/std/tests/P0009R18_mdspan_layout_stride/test.cpp +++ b/tests/std/tests/P0009R18_mdspan_layout_stride/test.cpp @@ -16,7 +16,7 @@ using namespace std; struct CmpEqual { template - constexpr bool operator()(T t, U u) { + [[nodiscard]] constexpr bool operator()(T t, U u) const noexcept { return cmp_equal(t, u); } }; From 210d8dd7ae6a61caf7986d6c29cf798b03b9035a Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Wed, 10 May 2023 18:08:17 -0700 Subject: [PATCH 5/5] Code review feedback. --- tests/std/include/test_mdspan_support.hpp | 10 +++++----- tests/std/tests/P0009R18_mdspan_layout_stride/test.cpp | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/std/include/test_mdspan_support.hpp b/tests/std/include/test_mdspan_support.hpp index 301e9d63b68..4fd9306bcfe 100644 --- a/tests/std/include/test_mdspan_support.hpp +++ b/tests/std/include/test_mdspan_support.hpp @@ -163,7 +163,7 @@ namespace details { template constexpr void check_members_with_mixed_extents(Fn&& fn) { auto select_extent = [](size_t e) consteval { - return e == std::dynamic_extent ? std::min(sizeof...(Extents), 3) : e; + return e == std::dynamic_extent ? std::min(sizeof...(Extents), size_t{3}) : e; }; // Check signed integers @@ -176,7 +176,7 @@ namespace details { // Check unsigned integers fn(std::extents{select_extent(Extents)...}); fn(std::extents{select_extent(Extents)...}); - fn(std::extents{select_extent(Extents)...}); + fn(std::extents{select_extent(Extents)...}); fn(std::extents{select_extent(Extents)...}); fn(std::extents{select_extent(Extents)...}); } @@ -184,7 +184,7 @@ namespace details { template constexpr void check_members_with_various_extents_impl(Fn&& fn, std::index_sequence) { auto static_or_dynamic = [](size_t i) consteval { - return i == 0 ? std::dynamic_extent : std::min(sizeof...(Seq), 3); + return i == 0 ? std::dynamic_extent : std::min(sizeof...(Seq), size_t{3}); }; if constexpr (sizeof...(Seq) <= 1) { @@ -215,7 +215,7 @@ constexpr void check_members_with_various_extents(Fn&& fn) { details::check_members_with_various_extents_impl(std::forward(fn), std::make_index_sequence<2>{}); details::check_members_with_various_extents_impl(std::forward(fn), std::make_index_sequence<4>{}); details::check_members_with_various_extents_impl(std::forward(fn), std::make_index_sequence<8>{}); -#if _PREFAST_ == 0 +#ifndef _PREFAST_ details::check_members_with_various_extents_impl(std::forward(fn), std::make_index_sequence<16>{}); -#endif // _PREFAST_ == 0 +#endif // _PREFAST_ } diff --git a/tests/std/tests/P0009R18_mdspan_layout_stride/test.cpp b/tests/std/tests/P0009R18_mdspan_layout_stride/test.cpp index 0a2f8bfc796..7900fa7c80e 100644 --- a/tests/std/tests/P0009R18_mdspan_layout_stride/test.cpp +++ b/tests/std/tests/P0009R18_mdspan_layout_stride/test.cpp @@ -159,7 +159,7 @@ constexpr void check_members(extents ext, const array(ext, strides); check_members_with_different_strides_index_type(ext, strides); - check_members_with_different_strides_index_type(ext, strides); + check_members_with_different_strides_index_type(ext, strides); check_members_with_different_strides_index_type(ext, strides); check_members_with_different_strides_index_type(ext, strides); } @@ -175,7 +175,7 @@ constexpr bool test() { // Check unsigned integers check_members(extents{5}, array{1}); check_members(extents{}, array{1, 6}); - check_members(extents{3}, array{1, 3}); + check_members(extents{3}, array{1, 3}); check_members(extents{}, array{1}); check_members(extents{3}, array{1, 3, 6});