Skip to content

Commit

Permalink
Implement P2408R5: Ranges Iterators As Inputs To Non-Ranges Algorithms (
Browse files Browse the repository at this point in the history
microsoft#2960)

Co-authored-by: Nicole Mazzuca <mazzucan@outlook.com>
Co-authored-by: Stephan T. Lavavej <stl@nuwen.net>
  • Loading branch information
3 people authored and fsb4000 committed Aug 13, 2022
1 parent abafd30 commit 40f5cee
Show file tree
Hide file tree
Showing 12 changed files with 425 additions and 169 deletions.
93 changes: 48 additions & 45 deletions stl/inc/algorithm

Large diffs are not rendered by default.

157 changes: 83 additions & 74 deletions stl/inc/execution

Large diffs are not rendered by default.

8 changes: 4 additions & 4 deletions stl/inc/functional
Original file line number Diff line number Diff line change
Expand Up @@ -2186,7 +2186,7 @@ template <class _FwdItHaystack, class _FwdItPat, class _Pred_eq>
_CONSTEXPR20 pair<_FwdItHaystack, _FwdItHaystack> _Search_pair_unchecked(
_FwdItHaystack _First1, _FwdItHaystack _Last1, _FwdItPat _First2, _FwdItPat _Last2, _Pred_eq& _Eq) {
// find first [_First2, _Last2) satisfying _Eq
if constexpr (_Is_random_iter_v<_FwdItHaystack> && _Is_random_iter_v<_FwdItPat>) {
if constexpr (_Is_ranges_random_iter_v<_FwdItHaystack> && _Is_ranges_random_iter_v<_FwdItPat>) {
_Iter_diff_t<_FwdItHaystack> _Count1 = _Last1 - _First1;
_Iter_diff_t<_FwdItPat> _Count2 = _Last2 - _First2;

Expand All @@ -2204,7 +2204,9 @@ _CONSTEXPR20 pair<_FwdItHaystack, _FwdItHaystack> _Search_pair_unchecked(
}

return {_Last1, _Last1};
} else if constexpr (_Is_fwd_iter_v<_FwdItHaystack> && _Is_fwd_iter_v<_FwdItPat>) {
} else {
static_assert(_Is_ranges_fwd_iter_v<_FwdItHaystack> && _Is_ranges_fwd_iter_v<_FwdItPat>,
"Iterators must be at least forward iterators");
for (;; ++_First1) { // loop until match or end of a sequence
_FwdItHaystack _Mid1 = _First1;
for (_FwdItPat _Mid2 = _First2;; ++_Mid1, (void) ++_Mid2) {
Expand All @@ -2221,8 +2223,6 @@ _CONSTEXPR20 pair<_FwdItHaystack, _FwdItHaystack> _Search_pair_unchecked(
}
}
}
} else {
static_assert(_Always_false<_FwdItHaystack>, "Iterators must be at least forward iterators");
}
}

Expand Down
4 changes: 2 additions & 2 deletions stl/inc/regex
Original file line number Diff line number Diff line change
Expand Up @@ -1985,7 +1985,7 @@ private:
template <class _InIt>
void _Reset(_InIt _First, _InIt _Last, flag_type _Flags) {
// build regular expression from iterator range
if constexpr (_Is_fwd_iter_v<_InIt>) {
if constexpr (_Is_ranges_fwd_iter_v<_InIt>) {
#if _ENHANCED_REGEX_VISUALIZER
_Visualization.assign(_First, _Last);
#endif // _ENHANCED_REGEX_VISUALIZER
Expand All @@ -1994,7 +1994,7 @@ private:
_Root_node* _Rx = _Prs._Compile();
_Reset(_Rx);
} else {
static_assert(_Is_input_iter_v<_InIt>, "Iterators must be at least input iterators");
static_assert(_Is_ranges_input_iter_v<_InIt>, "Iterators must be at least input iterators");

basic_string<_Iter_value_t<_InIt>> _Str(_First, _Last);

Expand Down
18 changes: 4 additions & 14 deletions stl/inc/vector
Original file line number Diff line number Diff line change
Expand Up @@ -694,7 +694,7 @@ public:
_Adl_verify_range(_First, _Last);
auto _UFirst = _Get_unwrapped(_First);
auto _ULast = _Get_unwrapped(_Last);
if constexpr (_Is_fwd_iter_v<_Iter>) {
if constexpr (_Is_ranges_fwd_iter_v<_Iter>) {
const auto _Count = _Convert_size<size_type>(static_cast<size_t>(_STD distance(_UFirst, _ULast)));
_Construct_n(_Count, _STD move(_UFirst), _STD move(_ULast));
#ifdef __cpp_lib_concepts
Expand Down Expand Up @@ -1206,12 +1206,7 @@ public:

_Adl_verify_range(_First, _Last);
const auto _Whereoff = static_cast<size_type>(_Whereptr - _Oldfirst);
#ifdef __cpp_lib_concepts
constexpr bool _Is_fwd = _Is_fwd_iter_v<_Iter> || forward_iterator<_Iter>;
#else // ^^^ __cpp_lib_concepts ^^^ / vvv !__cpp_lib_concepts vvv
constexpr bool _Is_fwd = _Is_fwd_iter_v<_Iter>;
#endif // ^^^ !__cpp_lib_concepts ^^^
if constexpr (_Is_fwd) {
if constexpr (_Is_ranges_fwd_iter_v<_Iter>) {
_Insert_forward_range(_Where, _Get_unwrapped(_First), _Get_unwrapped(_Last));
} else {
_Insert_input_range(_Where, _Get_unwrapped(_First), _Get_unwrapped(_Last));
Expand Down Expand Up @@ -1362,12 +1357,7 @@ public:
template <class _Iter, enable_if_t<_Is_iterator_v<_Iter>, int> = 0>
_CONSTEXPR20 void assign(_Iter _First, _Iter _Last) {
_Adl_verify_range(_First, _Last);
#ifdef __cpp_lib_concepts
constexpr bool _Is_fwd = _Is_fwd_iter_v<_Iter> || forward_iterator<_Iter>;
#else // ^^^ __cpp_lib_concepts ^^^ / vvv !__cpp_lib_concepts vvv
constexpr bool _Is_fwd = _Is_fwd_iter_v<_Iter>;
#endif // ^^^ !__cpp_lib_concepts ^^^
if constexpr (_Is_fwd) {
if constexpr (_Is_ranges_fwd_iter_v<_Iter>) {
_Assign_forward_range(_Get_unwrapped(_First), _Get_unwrapped(_Last));
} else {
_Assign_input_range(_Get_unwrapped(_First), _Get_unwrapped(_Last));
Expand Down Expand Up @@ -3145,7 +3135,7 @@ public:
_CONSTEXPR20 iterator insert(const_iterator _Where, _Iter _First, _Iter _Last) {
const difference_type _Saved_offset = _Where - begin();

if constexpr (_Is_fwd_iter_v<_Iter>) {
if constexpr (_Is_ranges_fwd_iter_v<_Iter>) {
_Adl_verify_range(_First, _Last);
const auto _Count = _Convert_size<size_type>(static_cast<size_t>(_STD distance(_First, _Last)));
const size_type _Off = _Insert_x(_Where, _Count);
Expand Down
4 changes: 2 additions & 2 deletions stl/inc/xstring
Original file line number Diff line number Diff line change
Expand Up @@ -2754,7 +2754,7 @@ private:
_My_data._Mysize = 0;
_My_data._Myres = _BUF_SIZE - 1;

if constexpr (_Is_fwd_iter_v<_Iter>) {
if constexpr (_Is_ranges_fwd_iter_v<_Iter>) {
const auto _Count = _Convert_size<size_type>(static_cast<size_t>(_STD distance(_First, _Last)));
if (_Count > max_size()) {
_Xlen_string(); // result too long
Expand All @@ -2776,7 +2776,7 @@ private:

_Tidy_deallocate_guard<basic_string> _Guard{this};
for (; _First != _Last; ++_First) {
if constexpr (!_Is_fwd_iter_v<_Iter>) {
if constexpr (!_Is_ranges_fwd_iter_v<_Iter>) {
if (_My_data._Mysize == _My_data._Myres) { // Need to grow
if (_My_data._Mysize == max_size()) {
_Xlen_string(); // result too long
Expand Down
80 changes: 56 additions & 24 deletions stl/inc/xutility
Original file line number Diff line number Diff line change
Expand Up @@ -843,16 +843,48 @@ template <class _Ty>
struct _Is_iterator : bool_constant<_Is_iterator_v<_Ty>> {};

template <class _Iter>
_INLINE_VAR constexpr bool _Is_input_iter_v = is_convertible_v<_Iter_cat_t<_Iter>, input_iterator_tag>;
_INLINE_VAR constexpr bool _Is_cpp17_input_iter_v = is_convertible_v<_Iter_cat_t<_Iter>, input_iterator_tag>;

template <class _Iter>
_INLINE_VAR constexpr bool _Is_fwd_iter_v = is_convertible_v<_Iter_cat_t<_Iter>, forward_iterator_tag>;
_INLINE_VAR constexpr bool _Is_ranges_input_iter_v =
#ifdef __cpp_lib_concepts
(input_iterator<_Iter> && sentinel_for<_Iter, _Iter>) ||
#endif
_Is_cpp17_input_iter_v<_Iter>;

template <class _Iter>
_INLINE_VAR constexpr bool _Is_cpp17_fwd_iter_v = is_convertible_v<_Iter_cat_t<_Iter>, forward_iterator_tag>;

template <class _Iter>
_INLINE_VAR constexpr bool _Is_ranges_fwd_iter_v =
#ifdef __cpp_lib_concepts
forward_iterator<_Iter> ||
#endif
_Is_cpp17_fwd_iter_v<_Iter>;

template <class _Iter>
_INLINE_VAR constexpr bool _Is_cpp17_bidi_iter_v = is_convertible_v<_Iter_cat_t<_Iter>, bidirectional_iterator_tag>;

template <class _Iter>
_INLINE_VAR constexpr bool _Is_bidi_iter_v = is_convertible_v<_Iter_cat_t<_Iter>, bidirectional_iterator_tag>;
_INLINE_VAR constexpr bool _Is_ranges_bidi_iter_v =
#ifdef __cpp_lib_concepts
bidirectional_iterator<_Iter> ||
#endif
_Is_cpp17_bidi_iter_v<_Iter>;

template <class _Iter>
_INLINE_VAR constexpr bool _Is_cpp17_random_iter_v = is_convertible_v<_Iter_cat_t<_Iter>, random_access_iterator_tag>;

template <class _Iter>
_INLINE_VAR constexpr bool _Is_random_iter_v = is_convertible_v<_Iter_cat_t<_Iter>, random_access_iterator_tag>;
_INLINE_VAR constexpr bool _Is_ranges_random_iter_v =
#if defined(__cpp_lib_concepts)
random_access_iterator<_Iter> ||
#endif
_Is_cpp17_random_iter_v<_Iter>;

#define _REQUIRE_CPP17_MUTABLE_ITERATOR(_Iter) \
static_assert(_Is_cpp17_fwd_iter_v<_Iter>, \
"Non-ranges algorithms require that mutable iterators be Cpp17ForwardIterators or stronger.")

template <class, class = void>
struct _Is_checked_helper {}; // default definition, no longer used, retained due to pseudo-documentation
Expand Down Expand Up @@ -1037,14 +1069,14 @@ template <class _ExPo>
using _Enable_if_execution_policy_t = typename remove_reference_t<_ExPo>::_Standard_execution_policy;

#define _REQUIRE_PARALLEL_ITERATOR(_Iter) \
static_assert(_Is_fwd_iter_v<_Iter>, "Parallel algorithms require forward iterators or stronger.")
static_assert(_Is_ranges_fwd_iter_v<_Iter>, "Parallel algorithms require forward iterators or stronger.")

#endif // _HAS_CXX17

template <class _Checked, class _Iter>
_NODISCARD constexpr auto _Idl_distance(const _Iter& _First, const _Iter& _Last) {
// tries to get the distance between _First and _Last if they are random-access iterators
if constexpr (_Is_random_iter_v<_Iter>) {
if constexpr (_Is_ranges_random_iter_v<_Iter>) {
return static_cast<_Iter_diff_t<_Checked>>(_Last - _First);
} else {
return _Distance_unknown{};
Expand Down Expand Up @@ -1098,7 +1130,7 @@ constexpr bool _Debug_lt_pred(_Pr&& _Pred, _Ty1&& _Left, _Ty2&& _Right) noexcept
template <class _InIt, class _Sentinel, class _Pr>
constexpr void _Debug_order_unchecked(_InIt _First, _Sentinel _Last, _Pr&& _Pred) {
// test if range is ordered by predicate
if constexpr (_Is_fwd_iter_v<_InIt>) {
if constexpr (_Is_ranges_fwd_iter_v<_InIt>) {
if (_First != _Last) {
for (auto _Next = _First; ++_Next != _Last; _First = _Next) {
_STL_VERIFY(!static_cast<bool>(_Pred(*_Next, *_First)), "sequence not ordered");
Expand All @@ -1110,7 +1142,7 @@ constexpr void _Debug_order_unchecked(_InIt _First, _Sentinel _Last, _Pr&& _Pred
template <class _OtherIt, class _InIt, class _Pr>
constexpr void _Debug_order_set_unchecked(_InIt _First, _InIt _Last, _Pr&& _Pred) {
// test if range is ordered by predicate
if constexpr (is_same_v<_Iter_value_t<_OtherIt>, _Iter_value_t<_InIt>> && _Is_fwd_iter_v<_InIt>) {
if constexpr (is_same_v<_Iter_value_t<_OtherIt>, _Iter_value_t<_InIt>>) {
_Debug_order_unchecked(_First, _Last, _Pred);
}
}
Expand All @@ -1119,17 +1151,17 @@ constexpr void _Debug_order_set_unchecked(_InIt _First, _InIt _Last, _Pr&& _Pred
// from <iterator>
template <class _InIt, class _Diff>
_CONSTEXPR17 void advance(_InIt& _Where, _Diff _Off) { // increment iterator by offset
if constexpr (_Is_random_iter_v<_InIt>) {
if constexpr (_Is_ranges_random_iter_v<_InIt>) {
_Where += _Off;
} else {
if constexpr (is_signed_v<_Diff> && !_Is_bidi_iter_v<_InIt>) {
if constexpr (is_signed_v<_Diff> && !_Is_ranges_bidi_iter_v<_InIt>) {
_STL_ASSERT(_Off >= 0, "negative advance of non-bidirectional iterator");
}

decltype(auto) _UWhere = _Get_unwrapped_n(_STD move(_Where), _Off);
constexpr bool _Need_rewrap = !is_reference_v<decltype(_Get_unwrapped_n(_STD move(_Where), _Off))>;

if constexpr (is_signed_v<_Diff> && _Is_bidi_iter_v<_InIt>) {
if constexpr (is_signed_v<_Diff> && _Is_ranges_bidi_iter_v<_InIt>) {
for (; _Off < 0; ++_Off) {
--_UWhere;
}
Expand All @@ -1147,7 +1179,7 @@ _CONSTEXPR17 void advance(_InIt& _Where, _Diff _Off) { // increment iterator by

template <class _InIt>
_NODISCARD _CONSTEXPR17 _Iter_diff_t<_InIt> distance(_InIt _First, _InIt _Last) {
if constexpr (_Is_random_iter_v<_InIt>) {
if constexpr (_Is_ranges_random_iter_v<_InIt>) {
return _Last - _First; // assume the iterator will do debug checking
} else {
_Adl_verify_range(_First, _Last);
Expand All @@ -1169,7 +1201,7 @@ constexpr _InIt _Next_iter(_InIt _First) { // increment iterator

template <class _InIt>
_NODISCARD _CONSTEXPR17 _InIt next(_InIt _First, _Iter_diff_t<_InIt> _Off = 1) { // increment iterator
static_assert(_Is_input_iter_v<_InIt>, "next requires input iterator");
static_assert(_Is_ranges_input_iter_v<_InIt>, "next requires input iterator");

_STD advance(_First, _Off);
return _First;
Expand All @@ -1182,7 +1214,7 @@ constexpr _BidIt _Prev_iter(_BidIt _First) { // decrement iterator

template <class _BidIt>
_NODISCARD _CONSTEXPR17 _BidIt prev(_BidIt _First, _Iter_diff_t<_BidIt> _Off = 1) { // decrement iterator
static_assert(_Is_bidi_iter_v<_BidIt>, "prev requires bidirectional iterator");
static_assert(_Is_ranges_bidi_iter_v<_BidIt>, "prev requires bidirectional iterator");

_STD advance(_First, -_Off);
return _First;
Expand Down Expand Up @@ -3711,7 +3743,7 @@ _FwdIt2 copy(_ExPo&&, _FwdIt1 _First, _FwdIt1 _Last, _FwdIt2 _Dest) noexcept /*
// copy [_First, _Last) to [_Dest, ...)
// not parallelized as benchmarks show it isn't worth it
_REQUIRE_PARALLEL_ITERATOR(_FwdIt1);
_REQUIRE_PARALLEL_ITERATOR(_FwdIt2);
_REQUIRE_CPP17_MUTABLE_ITERATOR(_FwdIt2);
return _STD copy(_First, _Last, _Dest);
}
#endif // _HAS_CXX17
Expand Down Expand Up @@ -3851,7 +3883,7 @@ _FwdIt2 copy_n(_ExPo&&, _FwdIt1 _First, _Diff _Count_raw, _FwdIt2 _Dest) noexcep
// copy [_First, _First + _Count) to [_Dest, ...)
// not parallelized as benchmarks show it isn't worth it
_REQUIRE_PARALLEL_ITERATOR(_FwdIt1);
_REQUIRE_PARALLEL_ITERATOR(_FwdIt2);
_REQUIRE_CPP17_MUTABLE_ITERATOR(_FwdIt2);
return _STD copy_n(_First, _Count_raw, _Dest);
}
#endif // _HAS_CXX17
Expand Down Expand Up @@ -3945,8 +3977,8 @@ template <class _ExPo, class _FwdIt1, class _FwdIt2, _Enable_if_execution_policy
_FwdIt2 move(_ExPo&&, _FwdIt1 _First, _FwdIt1 _Last, _FwdIt2 _Dest) noexcept /* terminates */ {
// move [_First, _Last) to [_Dest, ...)
// not parallelized as benchmarks show it isn't worth it
_REQUIRE_PARALLEL_ITERATOR(_FwdIt1);
_REQUIRE_PARALLEL_ITERATOR(_FwdIt2);
_REQUIRE_CPP17_MUTABLE_ITERATOR(_FwdIt1);
_REQUIRE_CPP17_MUTABLE_ITERATOR(_FwdIt2);
return _STD move(_First, _Last, _Dest);
}
#endif // _HAS_CXX17
Expand Down Expand Up @@ -4091,7 +4123,7 @@ template <class _ExPo, class _FwdIt, class _Ty, _Enable_if_execution_policy_t<_E
void fill(_ExPo&&, _FwdIt _First, _FwdIt _Last, const _Ty& _Val) noexcept /* terminates */ {
// copy _Val through [_First, _Last)
// not parallelized as benchmarks show it isn't worth it
_REQUIRE_PARALLEL_ITERATOR(_FwdIt);
_REQUIRE_CPP17_MUTABLE_ITERATOR(_FwdIt);
return _STD fill(_First, _Last, _Val);
}
#endif // _HAS_CXX17
Expand Down Expand Up @@ -4139,7 +4171,7 @@ template <class _ExPo, class _FwdIt, class _Diff, class _Ty, _Enable_if_executio
_FwdIt fill_n(_ExPo&&, _FwdIt _Dest, _Diff _Count_raw, const _Ty& _Val) noexcept /* terminates */ {
// copy _Val _Count times through [_Dest, ...)
// not parallelized as benchmarks show it isn't worth it
_REQUIRE_PARALLEL_ITERATOR(_FwdIt);
_REQUIRE_CPP17_MUTABLE_ITERATOR(_FwdIt);
return _STD fill_n(_Dest, _Count_raw, _Val);
}
#endif // _HAS_CXX17
Expand Down Expand Up @@ -4338,7 +4370,7 @@ _NODISCARD _CONSTEXPR20 bool equal(
const auto _ULast1 = _Get_unwrapped(_Last1);
auto _UFirst2 = _Get_unwrapped(_First2);
const auto _ULast2 = _Get_unwrapped(_Last2);
if constexpr (_Is_random_iter_v<_InIt1> && _Is_random_iter_v<_InIt2>) {
if constexpr (_Is_ranges_random_iter_v<_InIt1> && _Is_ranges_random_iter_v<_InIt2>) {
if (_ULast1 - _UFirst1 != _ULast2 - _UFirst2) {
return false;
}
Expand Down Expand Up @@ -5142,7 +5174,7 @@ _NODISCARD _CONSTEXPR20 bool _Check_match_counts(
// test if [_First1, _Last1) == permuted [_First2, _Last2), after matching prefix removal
_STL_INTERNAL_CHECK(!_Pred(*_First1, *_First2));
_STL_INTERNAL_CHECK(_STD distance(_First1, _Last1) == _STD distance(_First2, _Last2));
if constexpr (_Is_bidi_iter_v<_FwdIt1> && _Is_bidi_iter_v<_FwdIt2>) {
if constexpr (_Is_ranges_bidi_iter_v<_FwdIt1> && _Is_ranges_bidi_iter_v<_FwdIt2>) {
do { // find last inequality
--_Last1;
--_Last2;
Expand Down Expand Up @@ -5255,12 +5287,12 @@ _CONSTEXPR20 _FwdIt rotate(_FwdIt _First, _FwdIt _Mid, _FwdIt _Last) {
return _First;
}

if constexpr (_Is_random_iter_v<_FwdIt>) {
if constexpr (_Is_cpp17_random_iter_v<_FwdIt>) {
_STD reverse(_UFirst, _UMid);
_STD reverse(_UMid, _ULast);
_STD reverse(_UFirst, _ULast);
_Seek_wrapped(_First, _UFirst + (_ULast - _UMid));
} else if constexpr (_Is_bidi_iter_v<_FwdIt>) {
} else if constexpr (_Is_cpp17_bidi_iter_v<_FwdIt>) {
_STD reverse(_UFirst, _UMid);
_STD reverse(_UMid, _ULast);
auto _Tmp = _Reverse_until_sentinel_unchecked(_UFirst, _UMid, _ULast);
Expand Down
13 changes: 9 additions & 4 deletions stl/inc/yvals_core.h
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,7 @@
// P2367R0 Remove Misuses Of List-Initialization From Clause 24 Ranges
// P2372R3 Fixing Locale Handling In chrono Formatters
// P2393R1 Cleaning Up Integer-Class Types
// P2408R5 Ranges Iterators As Inputs To Non-Ranges Algorithms
// P2415R2 What Is A view?
// P2418R2 Add Support For std::generator-like Types To std::format
// P2432R1 Fix istream_view
Expand Down Expand Up @@ -1383,6 +1384,14 @@ _EMIT_STL_ERROR(STL1004, "C++98 unexpected() is incompatible with C++23 unexpect
#endif // __cpp_impl_coroutine

#if _HAS_CXX20
#if !defined(__EDG__) || defined(__INTELLISENSE__) // TRANSITION, EDG concepts support
#define __cpp_lib_concepts 202002L
#endif // !defined(__EDG__) || defined(__INTELLISENSE__)

#if defined(__cpp_lib_concepts)
#define __cpp_lib_algorithm_iterator_requirements 202207L
#endif

#define __cpp_lib_assume_aligned 201811L
#define __cpp_lib_atomic_flag_test 201907L
#define __cpp_lib_atomic_float 201711L
Expand All @@ -1396,10 +1405,6 @@ _EMIT_STL_ERROR(STL1004, "C++98 unexpected() is incompatible with C++23 unexpect
#define __cpp_lib_bitops 201907L
#define __cpp_lib_bounded_array_traits 201902L

#if !defined(__EDG__) || defined(__INTELLISENSE__) // TRANSITION, EDG concepts support
#define __cpp_lib_concepts 202002L
#endif // !defined(__EDG__) || defined(__INTELLISENSE__)

#define __cpp_lib_constexpr_algorithms 201806L
#define __cpp_lib_constexpr_complex 201711L
#define __cpp_lib_constexpr_dynamic_alloc 201907L
Expand Down
1 change: 1 addition & 0 deletions tests/std/test.lst
Original file line number Diff line number Diff line change
Expand Up @@ -491,6 +491,7 @@ tests\P2302R4_ranges_alg_contains
tests\P2302R4_ranges_alg_contains_subrange
tests\P2321R2_proxy_reference
tests\P2401R0_conditional_noexcept_for_exchange
tests\P2408R5_ranges_iterators_to_classic_algorithms
tests\P2415R2_owning_view
tests\P2440R1_ranges_alg_shift_left
tests\P2440R1_ranges_alg_shift_right
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Copyright (c) Microsoft Corporation.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

RUNALL_INCLUDE ..\strict_concepts_20_matrix.lst
Loading

0 comments on commit 40f5cee

Please sign in to comment.