<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Issue 2784: Resolution to LWG 2484 is missing "otherwise, no effects" and is hard to parse</title>
<meta property="og:title" content="Issue 2784: Resolution to LWG 2484 is missing &quot;otherwise, no effects&quot; and is hard to parse">
<meta property="og:description" content="C++ library issue. Status: C++17">
<meta property="og:url" content="https://cplusplus.github.io/LWG/issue2784.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++17">C++17</a> status.</em></p>
<h3 id="2784"><a href="lwg-defects.html#2784">2784</a>. Resolution to LWG 2484 is missing "otherwise, no effects" and is hard to parse</h3>
<p><b>Section:</b> 17.9.8 <a href="https://wg21.link/except.nested">[except.nested]</a> <b>Status:</b> <a href="lwg-active.html#C++17">C++17</a>
 <b>Submitter:</b> Jonathan Wakely <b>Opened:</b> 2016-10-15 <b>Last modified:</b> 2017-07-30</p>
<p><b>Priority: </b>0
</p>
<p><b>View all other</b> <a href="lwg-index.html#except.nested">issues</a> in [except.nested].</p>
<p><b>View all issues with</b> <a href="lwg-status.html#C++17">C++17</a> status.</p>
<p><b>Discussion:</b></p>
<p>
The discussion notes for LWG <a href="lwg-defects.html#2484" title="rethrow_if_nested() is doubly unimplementable (Status: C++17)">2484</a><sup><a href="https://cplusplus.github.io/LWG/issue2484" title="Latest snapshot">(i)</a></sup> point out there should be an "else, no effects" at the end, 
which didn't make it into the resolution. Without this it's unclear whether it should do nothing, or be ill-formed, 
or undefined.
<p/>
Additionally, the precise effects of the <i>Effects</i> are hard to determine, because the conditions on the 
static type and dynamic type are intermingled, but must actually be checked separately (the static checks must 
be done statically and the dynamic checks must be done dynamically!) Furthermore, the obvious way to know if 
"the dynamic type of <code>e</code> is <code>nested_exception</code> or is publicly and unambiguously derived from 
<code>nested_exception</code>" is to use <code>dynamic_cast</code>, so we have to use <code>dynamic_cast</code> to find out 
whether to perform the <code>dynamic_cast</code> expression specified in the <i>Effects</i>. It would make more sense 
to specify it in terms of a <code>dynamic_cast</code> to a pointer type, and only call <code>rethrow_nested()</code> if 
the result is not null.
<p/>
The entire spec can be expressed in C++17 as:
</p>
<blockquote><pre>
if constexpr(is_polymorphic_v&lt;E&gt; &amp;&amp; (!is_base_of_v&lt;nested_exception, E&gt; || is_convertible_v&lt;E*, nested_exception*&gt;))
  if (auto p = dynamic_cast&lt;const nested_exception*&gt;(addressof(e)))
    p->rethrow_nested();
</pre></blockquote>
<p>
This uses traits to perform checks on the static type, then uses <code>dynamic_cast</code> to perform the checks on the 
dynamic type. I think the spec would be clearer if it had the same structure.
</p>
<p><i>[2016-11-12, Issaquah]</i></p>

<p>Sat AM: Priority 0; move to Ready</p>


<p id="res-2784"><b>Proposed resolution:</b></p>
<p>
This wording is relative to N4606.
</p>

<ol>
<li><p>Modify 17.9.8 <a href="https://wg21.link/except.nested">[except.nested]</a> p9:</p>

<blockquote>
<pre>
template &lt;class E&gt; void rethrow_if_nested(const E&amp; e);
</pre>
<blockquote>
<p>
-9- <i>Effects:</i> If <code>E</code> is not a polymorphic class type, <ins>or if <code>nested_exception</code> is an inaccessible 
or ambiguous base class of <code>E</code>,</ins> there is no effect. Otherwise, <del>if the static type or 
the dynamic type of <code>e</code> is <code>nested_exception</code> or is publicly and unambiguously derived from 
<code>nested_exception</code>, calls</del><ins>performs</ins>:
</p>
<blockquote>
<pre>
<del>dynamic_cast&lt;const nested_exception&amp;&gt;(e).rethrow_nested();</del>
<ins>if (auto p = dynamic_cast&lt;const nested_exception*&gt;(addressof(e)))
  p-&gt;rethrow_nested();</ins>
</pre>
</blockquote>
</blockquote>
</blockquote>
</li>
</ol>






</body>
</html>
