<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<TITLE>
    CWG Issue 2365</TITLE>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<STYLE TYPE="text/css">
  INS { text-decoration:none; font-weight:bold; background-color:#A0FFA0 }
  .INS { text-decoration:none; background-color:#D0FFD0 }
  DEL { text-decoration:line-through; background-color:#FFA0A0 }
  .DEL { text-decoration:line-through; background-color: #FFD0D0 }
  @media (prefers-color-scheme: dark) {
    HTML { background-color:#202020; color:#f0f0f0; }
    A { color:#5bc0ff; }
    A:visited { color:#c6a8ff; }
    A:hover, a:focus { color:#afd7ff; }
    INS { background-color:#033a16; color:#aff5b4; }
    .INS { background-color: #033a16; }
    DEL { background-color:#67060c; color:#ffdcd7; }
    .DEL { background-color:#67060c; }
  }
  SPAN.cmnt { font-family:Times; font-style:italic }
</STYLE>
</HEAD>
<BODY>
<P><EM>This is an unofficial snapshot of the ISO/IEC JTC1 SC22 WG21
  Core Issues List revision 118b.
  See http://www.open-std.org/jtc1/sc22/wg21/ for the official
  list.</EM></P>
<P>2025-09-28</P>
<HR>
<A NAME="2365"></A><H4>2365.
  
Confusing specification for <TT>dynamic_cast</TT>
</H4>
<B>Section: </B>7.6.1.7&#160; [<A href="https://wg21.link/expr.dynamic.cast">expr.dynamic.cast</A>]
 &#160;&#160;&#160;

 <B>Status: </B>CD5
 &#160;&#160;&#160;

 <B>Submitter: </B>Shiyao Ma
 &#160;&#160;&#160;

 <B>Date: </B>2017-02-08<BR>


<P>[Accepted as a DR at the February, 2019 meeting.]</P>

<P>From editorial
issue <A HREF="https://github.com/cplusplus/draft/issues/1453">1453</A>.</P>

<P>According to 7.6.1.7 [<A href="https://wg21.link/expr.dynamic.cast#4">expr.dynamic.cast</A>] paragraph 4,</P>

<BLOCKQUOTE>

If the value of <TT>v</TT>
is a null pointer value in the pointer case, the result
is the null pointer value of type <TT>T</TT>.

</BLOCKQUOTE>

<P>Paragraph 5 deals with the case of a simple up-cast, where no runtime
type identification is required. Paragraph 6 says,</P>

<BLOCKQUOTE>

Otherwise, <TT>v</TT> shall be a pointer to or a glvalue of a polymorphic
type (11.7.3 [<A href="https://wg21.link/class.virtual">class.virtual</A>]).

</BLOCKQUOTE>

<P>This organization of the material makes it sound as if the requirement
for polymorphic class types does not apply if the argument is a null
pointer value, which, of course, cannot be determined at compile time. The
intent is that a null pointer value argument produces a null pointer value
result, regardless of whether the relationship between the classes requires
runtime type identification or not, but that the requirement for
polymorphic classes applies for all casts that are not simple up-casts. The
wording should be clarified.</P>

<P><B>Proposed resolution (November, 2018):</B></P>

<P>Change 7.6.1.7 [<A href="https://wg21.link/expr.dynamic.cast">expr.dynamic.cast</A>] paragraphs 4-6 as follows:</P>

<BLOCKQUOTE>

<P>
<DEL>If the value of <TT>v</TT>
is a null pointer value in the pointer
case, the result is the null pointer value of type <TT>T</TT>.</DEL>
</P>

<P>If <TT>T</TT>
is &#8220;pointer to <I>cv1</I> <TT>B</TT>&#8221; and <TT>v</TT>
has type &#8220;pointer to <I>cv2</I>
<TT>D</TT>&#8221; such that <TT>B</TT> is a base class
of <TT>D</TT>, the result is a pointer to the
unique <TT>B</TT> subobject of the <TT>D</TT> object pointed
to by <TT>v</TT><INS>, or a null pointer value if <TT>v</TT>
is a null pointer value</INS>. Similarly, if <TT>T</TT> is...</P>

<P>Otherwise, <TT>v</TT>
shall be a pointer to or a glvalue of a
polymorphic type (11.7.3 [<A href="https://wg21.link/class.virtual">class.virtual</A>]).</P>

<P><INS>If <TT>v</TT> is a null pointer value, the result is a
null pointer value.</INS></P>

</BLOCKQUOTE>

<BR><BR>
</BODY>
</HTML>
