<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Issue 2965: Non-existing path::native_string() in filesystem_error::what() specification</title>
<meta property="og:title" content="Issue 2965: Non-existing path::native_string() in filesystem_error::what() specification">
<meta property="og:description" content="C++ library issue. Status: C++20">
<meta property="og:url" content="https://cplusplus.github.io/LWG/issue2965.html">
<meta property="og:type" content="website">
<meta property="og:image" content="http://cplusplus.github.io/LWG/images/cpp_logo.png">
<meta property="og:image:alt" content="C++ logo">
<style>
  p {text-align:justify}
  li {text-align:justify}
  pre code.backtick::before { content: "`" }
  pre code.backtick::after { content: "`" }
  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.issues-index { border: 1px solid; border-collapse: collapse; }
  table.issues-index th { text-align: center; padding: 4px; border: 1px solid; }
  table.issues-index td { padding: 4px; border: 1px solid; }
  table.issues-index td:nth-child(1) { text-align: right; }
  table.issues-index td:nth-child(2) { text-align: left; }
  table.issues-index td:nth-child(3) { text-align: left; }
  table.issues-index td:nth-child(4) { text-align: left; }
  table.issues-index td:nth-child(5) { text-align: center; }
  table.issues-index td:nth-child(6) { text-align: center; }
  table.issues-index td:nth-child(7) { text-align: left; }
  table.issues-index td:nth-child(5) span.no-pr { color: red; }
  @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#C++20">C++20</a> status.</em></p>
<h3 id="2965"><a href="lwg-defects.html#2965">2965</a>. Non-existing <code>path::native_string()</code> in <code>filesystem_error::what()</code> specification</h3>
<p><b>Section:</b> 31.12.7.2 <a href="https://wg21.link/fs.filesystem.error.members">[fs.filesystem.error.members]</a> <b>Status:</b> <a href="lwg-active.html#C++20">C++20</a>
 <b>Submitter:</b> Daniel Kr&uuml;gler <b>Opened:</b> 2017-05-22 <b>Last modified:</b> 2021-06-06</p>
<p><b>Priority: </b>0
</p>
<p><b>View all other</b> <a href="lwg-index.html#fs.filesystem.error.members">issues</a> in [fs.filesystem.error.members].</p>
<p><b>View all issues with</b> <a href="lwg-status.html#C++20">C++20</a> status.</p>
<p><b>Discussion:</b></p>
<p>
As pointed out by Jonathan Wakely and Bo Persson,  [filesystem_error.members]/7 refers to a non-existing
function <code>path::native_string</code>:
</p>
<blockquote><p>
<i>Returns:</i> A string containing <code>runtime_error::what()</code>. The exact format is unspecified. Implementations
are encouraged but not required to include <code>path1.native_string()</code> if not empty,
<code>path2.native_string()</code> if not empty, and <code>system_error::what()</code> strings in the returned string.
</p></blockquote>
<p>
Existing implementations differ, as Jonathan also determined:
</p>
<ul>
<li><p>Boost.Filesystem uses <code>path::string()</code>.</p></li>
<li><p>Libstdc++ uses <code>path::string()</code>.</p></li>
<li><p>MSVC++/Dinkumware uses <code>path::u8string()</code>.</p></li>
<li><p>It seems that libc++ doesn't include the paths in <code>what()</code>.</p></li>
</ul>
<p>
We've had <code>native_string()</code> in the spec since <a href="https://wg21.link/n3239#filesystem_error-what">N3239</a> (where
it already didn't match any existing <code>path</code> function at that time).
<p/>
Before that it was <code>file_string()</code> in <a href="https://wg21.link/n1975#basic_filesystem_error-observers">N1975</a>
(within that specification <code>path</code> was a template that was parametrized in the character type).
<p/>
Since it can't be <code>path::native()</code> because that might be the wrong type, one of <code>path::string()</code> or
<code>path::u8string()</code> seems appropriate.
<p/>
Albeit the wording is just a non-binding encouragement to implementations, the decision on this matter should not be
considered editorially due to the existing implementation variance. Any official resolution of the current state could
cause a reconsideration of existing implementations, and therefore it should be documented.
</p>

<p><strong>Previous resolution [SUPERSEDED]:</strong></p>
<blockquote class="note">
<p>This wording is relative to <a href="https://wg21.link/n4659">N4659</a>.</p>

<ol>
<li>
<p>Edit  [filesystem_error.members] as indicated:</p>

<blockquote>
<pre>
const char* what() const noexcept override;
</pre>
<blockquote>
<p>
-7- <i>Returns:</i> A string containing <code>runtime_error::what()</code>. The exact format is unspecified. Implementations
are encouraged but not required to include <code>path1.<del>native_</del>string()</code> if not empty,
<code>path2.<del>native_</del>string()</code> if not empty, and <code>system_error::what()</code> strings in the returned string.
</p>
</blockquote>
</blockquote>
</li>
</ol>
</blockquote>

<p><i>[2017-05-25, Jonathan comments and suggests an alternative resolution]</i></p>

<p>
The revised wording changes leave it up to the implementation which of the native format observers to use. The
"if not empty" seems redundant, because if the path is empty then there's nothing to include anyway, but the
proposed resolution preserves it.
</p>

<p><i>[2017-07 Toronto Monday issue prioritization]</i></p>

<p>Priority 0; move to Ready</p>


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

<ol>
<li>
<p>Edit  [filesystem_error.members] as indicated:</p>

<blockquote>
<pre>
const char* what() const noexcept override;
</pre>
<blockquote>
<p>
-7- <i>Returns:</i> A string containing <code>runtime_error::what()</code>. The exact format is unspecified. Implementations
are encouraged but not required to include <del><code>path1.native_string()</code> if not empty,
<code>path2.native_string()</code> if not empty, and <code>system_error::what()</code> strings</del><ins>the
<code>system_error::what()</code> string and the pathnames of <code>path1</code> and <code>path2</code> in the native format</ins>
in the returned string.
</p>
</blockquote>
</blockquote>
</li>
</ol>





</body>
</html>
