Skip to content

Commit

Permalink
Automatic update from GitHub Actions workflow
Browse files Browse the repository at this point in the history
  • Loading branch information
github-actions committed Nov 25, 2023
1 parent dc9db4a commit d79f5b7
Show file tree
Hide file tree
Showing 22 changed files with 490 additions and 97 deletions.
133 changes: 133 additions & 0 deletions issue4017.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta charset="utf-8">
<title>Issue 4017: Behavior of std::views::split on an empty range</title>
<style type="text/css">
p {text-align:justify}
li {text-align:justify}
blockquote.note
{
background-color:#E0E0E0;
padding-left: 15px;
padding-right: 15px;
padding-top: 1px;
padding-bottom: 1px;
}
ins {background-color:#A0FFA0}
del {background-color:#FFA0A0}
table {border-collapse: collapse;}
@media (prefers-color-scheme: dark) {
html {
color: #ddd;
background-color: black;
}
ins {
background-color: #225522
}
del {
background-color: #662222
}
a {
color: #6af
}
a:visited {
color: #6af
}
blockquote.note
{
background-color: rgba(255, 255, 255, .10)
}
}
</style>
</head>
<body>
<hr>
<p><em>This page is a snapshot from the LWG issues list, see the <a href="lwg-active.html">Library Active Issues List</a> for more information and the meaning of <a href="lwg-active.html#New">New</a> status.</em></p>
<h3><a name="4017" href="lwg-active.html#4017">4017</a>. Behavior of <tt>std::views::split</tt> on an empty range</h3>
<p><b>Section:</b> 26.7.17.3 <a href="https://wg21.link/range.split.iterator">[range.split.iterator]</a> <b>Status:</b> <a href="lwg-active.html#New">New</a>
<b>Submitter:</b> Barry Revzin <b>Opened:</b> 2023-11-19 <b>Last modified:</b> 2023-11-25</p>
<p><b>Priority: </b>Not Prioritized
</p>
<p><b>View all issues with</b> <a href="lwg-status.html#New">New</a> status.</p>
<p><b>Discussion:</b></p>
<p>
Consider the following example (which uses <tt>fmt::println</tt> instead of <tt>std::println</tt>,
but they do the same thing in C++23):
</p>
<blockquote><pre>
#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;ranges&gt;
#include &lt;fmt/ranges.h&gt;

int main()
{
fmt::println("{}", std::views::split(std::string(" x "), ' '));
fmt::println("{}", std::views::split(std::string(" "), ' '));
fmt::println("{}", std::views::split(std::string("x"), ' '));
fmt::println("{}", std::views::split(std::string(""), ' '));
}
</pre></blockquote>
<p>
The output of this program (as specified today) is
</p>
<blockquote><pre>
[[], ['x'], []]
[[], []]
[['x']]
[]
</pre></blockquote>
<p>
The principle set out in LWG <a href="lwg-defects.html#3478">3478</a> is that splitting a sequence containing <tt>N</tt>
delimiters should lead to <tt>N+1</tt> subranges. That principle was broken if the <tt>N</tt>-th
delimiter was at the end of the sequence, which was fixed by <a href="https://wg21.link/P2210">P2210</a>.
<p/>
However, the principle is still broken if the sequence contains zero delimiters. A non-empty sequence
will split into one range, but an empty sequence will split into zero ranges. That last line is incorrect
&mdash; splitting an empty range on a delimiter should yield a range of an empty range &mdash; not
simply an empty range.
<p/>
Proposed Resolution: Currently, <tt>split_view::iterator</tt>'s constructor unconditionally initializes
<tt><i>trailing_empty_</i></tt> to <tt>false</tt>. Instead, change 26.7.17.3 <a href="https://wg21.link/range.split.iterator">[range.split.iterator]</a>/1
to initialize <tt><i>trailing_empty_</i></tt> to <tt><i>cur_</i> == <i>next_</i>.begin()</tt> (i.e.
<tt><i>trailing_empty_</i></tt> is typically <tt>false</tt>, but if we're empty on initialization then we
have to have a trailing empty range).
<p/>
The following demo shows my implementation from <a href="https://wg21.link/P2210">P2210</a>, adjusted to fix this:
<a href="https://godbolt.org/z/axWb64j9f">godbolt.org/z/axWb64j9f</a>
</p>


<p id="res-4017"><b>Proposed resolution:</b></p>
<p>
This wording is relative to <a href="https://wg21.link/N4964">N4964</a>.
</p>

<ol>

<li><p>Modify 26.7.17.3 <a href="https://wg21.link/range.split.iterator">[range.split.iterator]</a> as indicated:</p>

<blockquote>
<pre>
constexpr <i>iterator</i>(split_view&amp; parent, iterator_t&lt;V&gt; current, subrange&lt;iterator_t&lt;V&gt;&gt; next);
</pre>
<blockquote>
<p>
-1- <i>Effects</i>: Initializes <tt><i>parent_</i></tt> with <tt>addressof(parent)</tt>, <tt><i>cur_</i></tt> with
<tt>std::move(current)</tt>, <del>and</del> <tt><i>next_</i></tt> with <tt>std::move(next)</tt><ins>, and
<tt><i>trailing_empty_</i></tt> with <tt><i>cur_</i> == <i>next_</i>.begin()</tt></ins>.
</p>
</blockquote>
</blockquote>
</li>

</ol>





</body>
</html>
95 changes: 90 additions & 5 deletions lwg-active.html
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@
</tr>
<tr>
<td align="left">Date:</td>
<td align="left">2023-11-24</td>
<td align="left">2023-11-25</td>
</tr>
<tr>
<td align="left">Project:</td>
Expand All @@ -62,7 +62,7 @@
</tr>
</table>
<h1>C++ Standard Library Active Issues List (Revision D125)</h1>
<p><p>Revised 2023-11-24 at 17:56:34 UTC</p>
<p><p>Revised 2023-11-25 at 13:21:24 UTC</p>
</p>
<p>Reference ISO/IEC IS 14882:2020(E)</p>
<p>Also see:</p>
Expand Down Expand Up @@ -182,15 +182,15 @@ <h2 id='History'>Revision History</h2>
<ul>
<li>D125: 2023-06-09 Post-Varna<ul>
<li><b>Summary:</b><ul>
<li>460 open issues, up by 30.</li>
<li>461 open issues, up by 31.</li>
<li>3043 closed issues, up by 43.</li>
<li>35 reassigned issues, down by 1.</li>
<li>3538 issues total, up by 72.</li>
<li>3539 issues total, up by 73.</li>
</ul></li>
<li><b>Details:</b><ul>
<li>Added the following 4 Ready issues: <a href="lwg-active.html#3950">3950</a>, <a href="lwg-active.html#3975">3975</a>, <a href="lwg-active.html#3984">3984</a>, <a href="lwg-active.html#3988">3988</a>.</li>
<li>Added the following 6 Tentatively NAD issues: <a href="lwg-active.html#3958">3958</a>, <a href="lwg-active.html#3980">3980</a>, <a href="lwg-active.html#3981">3981</a>, <a href="lwg-active.html#3982">3982</a>, <a href="lwg-active.html#3996">3996</a>, <a href="lwg-active.html#4003">4003</a>.</li>
<li>Added the following 47 New issues: <a href="lwg-active.html#3945">3945</a>, <a href="lwg-active.html#3952">3952</a>, <a href="lwg-active.html#3954">3954</a>, <a href="lwg-active.html#3955">3955</a>, <a href="lwg-active.html#3956">3956</a>, <a href="lwg-active.html#3959">3959</a>, <a href="lwg-active.html#3960">3960</a>, <a href="lwg-active.html#3961">3961</a>, <a href="lwg-active.html#3962">3962</a>, <a href="lwg-active.html#3963">3963</a>, <a href="lwg-active.html#3964">3964</a>, <a href="lwg-active.html#3966">3966</a>, <a href="lwg-active.html#3967">3967</a>, <a href="lwg-active.html#3968">3968</a>, <a href="lwg-active.html#3969">3969</a>, <a href="lwg-active.html#3972">3972</a>, <a href="lwg-active.html#3976">3976</a>, <a href="lwg-active.html#3977">3977</a>, <a href="lwg-active.html#3978">3978</a>, <a href="lwg-active.html#3979">3979</a>, <a href="lwg-active.html#3983">3983</a>, <a href="lwg-active.html#3985">3985</a>, <a href="lwg-active.html#3986">3986</a>, <a href="lwg-active.html#3989">3989</a>, <a href="lwg-active.html#3991">3991</a>, <a href="lwg-active.html#3992">3992</a>, <a href="lwg-active.html#3993">3993</a>, <a href="lwg-active.html#3994">3994</a>, <a href="lwg-active.html#3995">3995</a>, <a href="lwg-active.html#3997">3997</a>, <a href="lwg-active.html#3998">3998</a>, <a href="lwg-active.html#3999">3999</a>, <a href="lwg-active.html#4000">4000</a>, <a href="lwg-active.html#4002">4002</a>, <a href="lwg-active.html#4004">4004</a>, <a href="lwg-active.html#4005">4005</a>, <a href="lwg-active.html#4006">4006</a>, <a href="lwg-active.html#4007">4007</a>, <a href="lwg-active.html#4008">4008</a>, <a href="lwg-active.html#4009">4009</a>, <a href="lwg-active.html#4010">4010</a>, <a href="lwg-active.html#4011">4011</a>, <a href="lwg-active.html#4012">4012</a>, <a href="lwg-active.html#4013">4013</a>, <a href="lwg-active.html#4014">4014</a>, <a href="lwg-active.html#4015">4015</a>, <a href="lwg-active.html#4016">4016</a>.</li>
<li>Added the following 48 New issues: <a href="lwg-active.html#3945">3945</a>, <a href="lwg-active.html#3952">3952</a>, <a href="lwg-active.html#3954">3954</a>, <a href="lwg-active.html#3955">3955</a>, <a href="lwg-active.html#3956">3956</a>, <a href="lwg-active.html#3959">3959</a>, <a href="lwg-active.html#3960">3960</a>, <a href="lwg-active.html#3961">3961</a>, <a href="lwg-active.html#3962">3962</a>, <a href="lwg-active.html#3963">3963</a>, <a href="lwg-active.html#3964">3964</a>, <a href="lwg-active.html#3966">3966</a>, <a href="lwg-active.html#3967">3967</a>, <a href="lwg-active.html#3968">3968</a>, <a href="lwg-active.html#3969">3969</a>, <a href="lwg-active.html#3972">3972</a>, <a href="lwg-active.html#3976">3976</a>, <a href="lwg-active.html#3977">3977</a>, <a href="lwg-active.html#3978">3978</a>, <a href="lwg-active.html#3979">3979</a>, <a href="lwg-active.html#3983">3983</a>, <a href="lwg-active.html#3985">3985</a>, <a href="lwg-active.html#3986">3986</a>, <a href="lwg-active.html#3989">3989</a>, <a href="lwg-active.html#3991">3991</a>, <a href="lwg-active.html#3992">3992</a>, <a href="lwg-active.html#3993">3993</a>, <a href="lwg-active.html#3994">3994</a>, <a href="lwg-active.html#3995">3995</a>, <a href="lwg-active.html#3997">3997</a>, <a href="lwg-active.html#3998">3998</a>, <a href="lwg-active.html#3999">3999</a>, <a href="lwg-active.html#4000">4000</a>, <a href="lwg-active.html#4002">4002</a>, <a href="lwg-active.html#4004">4004</a>, <a href="lwg-active.html#4005">4005</a>, <a href="lwg-active.html#4006">4006</a>, <a href="lwg-active.html#4007">4007</a>, <a href="lwg-active.html#4008">4008</a>, <a href="lwg-active.html#4009">4009</a>, <a href="lwg-active.html#4010">4010</a>, <a href="lwg-active.html#4011">4011</a>, <a href="lwg-active.html#4012">4012</a>, <a href="lwg-active.html#4013">4013</a>, <a href="lwg-active.html#4014">4014</a>, <a href="lwg-active.html#4015">4015</a>, <a href="lwg-active.html#4016">4016</a>, <a href="lwg-active.html#4017">4017</a>.</li>
<li>Added the following SG9 issue: <a href="lwg-active.html#3971">3971</a>.</li>
<li>Added the following 14 WP issues: <a href="lwg-defects.html#3946">3946</a>, <a href="lwg-defects.html#3947">3947</a>, <a href="lwg-defects.html#3948">3948</a>, <a href="lwg-defects.html#3949">3949</a>, <a href="lwg-defects.html#3951">3951</a>, <a href="lwg-defects.html#3953">3953</a>, <a href="lwg-defects.html#3957">3957</a>, <a href="lwg-defects.html#3965">3965</a>, <a href="lwg-defects.html#3970">3970</a>, <a href="lwg-defects.html#3973">3973</a>, <a href="lwg-defects.html#3974">3974</a>, <a href="lwg-defects.html#3987">3987</a>, <a href="lwg-defects.html#3990">3990</a>, <a href="lwg-defects.html#4001">4001</a>.</li>
<li>Changed the following issue to Ready (from New): <a href="lwg-active.html#3919">3919</a>.</li>
Expand Down Expand Up @@ -55565,5 +55565,90 @@ <h3><a name="4016" href="#4016">4016</a><sup><a href="https://cplusplus.github.i



<hr>
<h3><a name="4017" href="#4017">4017</a><sup><a href="https://cplusplus.github.io/LWG/issue4017">(i)</a></sup>. Behavior of <tt>std::views::split</tt> on an empty range</h3>
<p><b>Section:</b> 26.7.17.3 <a href="https://wg21.link/range.split.iterator">[range.split.iterator]</a> <b>Status:</b> <a href="lwg-active.html#New">New</a>
<b>Submitter:</b> Barry Revzin <b>Opened:</b> 2023-11-19 <b>Last modified:</b> 2023-11-25</p>
<p><b>Priority: </b>Not Prioritized
</p>
<p><b>View all issues with</b> <a href="lwg-status.html#New">New</a> status.</p>
<p><b>Discussion:</b></p>
<p>
Consider the following example (which uses <tt>fmt::println</tt> instead of <tt>std::println</tt>,
but they do the same thing in C++23):
</p>
<blockquote><pre>
#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;ranges&gt;
#include &lt;fmt/ranges.h&gt;

int main()
{
fmt::println("{}", std::views::split(std::string(" x "), ' '));
fmt::println("{}", std::views::split(std::string(" "), ' '));
fmt::println("{}", std::views::split(std::string("x"), ' '));
fmt::println("{}", std::views::split(std::string(""), ' '));
}
</pre></blockquote>
<p>
The output of this program (as specified today) is
</p>
<blockquote><pre>
[[], ['x'], []]
[[], []]
[['x']]
[]
</pre></blockquote>
<p>
The principle set out in LWG <a href="lwg-defects.html#3478">3478</a> is that splitting a sequence containing <tt>N</tt>
delimiters should lead to <tt>N+1</tt> subranges. That principle was broken if the <tt>N</tt>-th
delimiter was at the end of the sequence, which was fixed by <a href="https://wg21.link/P2210">P2210</a>.
<p/>
However, the principle is still broken if the sequence contains zero delimiters. A non-empty sequence
will split into one range, but an empty sequence will split into zero ranges. That last line is incorrect
&mdash; splitting an empty range on a delimiter should yield a range of an empty range &mdash; not
simply an empty range.
<p/>
Proposed Resolution: Currently, <tt>split_view::iterator</tt>'s constructor unconditionally initializes
<tt><i>trailing_empty_</i></tt> to <tt>false</tt>. Instead, change 26.7.17.3 <a href="https://wg21.link/range.split.iterator">[range.split.iterator]</a>/1
to initialize <tt><i>trailing_empty_</i></tt> to <tt><i>cur_</i> == <i>next_</i>.begin()</tt> (i.e.
<tt><i>trailing_empty_</i></tt> is typically <tt>false</tt>, but if we're empty on initialization then we
have to have a trailing empty range).
<p/>
The following demo shows my implementation from <a href="https://wg21.link/P2210">P2210</a>, adjusted to fix this:
<a href="https://godbolt.org/z/axWb64j9f">godbolt.org/z/axWb64j9f</a>
</p>


<p id="res-4017"><b>Proposed resolution:</b></p>
<p>
This wording is relative to <a href="https://wg21.link/N4964">N4964</a>.
</p>

<ol>

<li><p>Modify 26.7.17.3 <a href="https://wg21.link/range.split.iterator">[range.split.iterator]</a> as indicated:</p>

<blockquote>
<pre>
constexpr <i>iterator</i>(split_view&amp; parent, iterator_t&lt;V&gt; current, subrange&lt;iterator_t&lt;V&gt;&gt; next);
</pre>
<blockquote>
<p>
-1- <i>Effects</i>: Initializes <tt><i>parent_</i></tt> with <tt>addressof(parent)</tt>, <tt><i>cur_</i></tt> with
<tt>std::move(current)</tt>, <del>and</del> <tt><i>next_</i></tt> with <tt>std::move(next)</tt><ins>, and
<tt><i>trailing_empty_</i></tt> with <tt><i>cur_</i> == <i>next_</i>.begin()</tt></ins>.
</p>
</blockquote>
</blockquote>
</li>

</ol>





</body>
</html>
Loading

0 comments on commit d79f5b7

Please sign in to comment.