<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
p.msonormal0, li.msonormal0, div.msonormal0
        {mso-style-name:msonormal;
        mso-margin-top-alt:auto;
        margin-right:0cm;
        mso-margin-bottom-alt:auto;
        margin-left:0cm;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.EmailStyle18
        {mso-style-type:personal;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
span.keywordtype
        {mso-style-name:keywordtype;}
span.keyword
        {mso-style-name:keyword;}
span.comment
        {mso-style-name:comment;}
span.keywordflow
        {mso-style-name:keywordflow;}
span.EmailStyle23
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:70.85pt 70.85pt 70.85pt 70.85pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="FR" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal"><span lang="EN-US">Oops, sorry, I posted too fast, my test case had another issue. Please ignore my previous message.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">--- <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Loïc<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><a name="_MailEndCompose"><o:p> </o:p></a></p>
<span style="mso-bookmark:_MailEndCompose"></span>
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal"><b><span style="mso-fareast-language:FR">De :</span></b><span style="mso-fareast-language:FR"> cfe-dev [mailto:cfe-dev-bounces@lists.llvm.org]
<b>De la part de</b> Loïc Joly via cfe-dev<br>
<b>Envoyé :</b> mercredi 7 juin 2017 22:01<br>
<b>À :</b> cfe-dev@lists.llvm.org<br>
<b>Objet :</b> [cfe-dev] IsVirtual for destructors<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Hello,<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span lang="EN-US">I’ve read the source code of the CXXMethodDecl::isVirtual function
<a href="https://clang.llvm.org/doxygen/DeclCXX_8h_source.html#l01877">https://clang.llvm.org/doxygen/DeclCXX_8h_source.html#l01877</a><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal" style="margin-left:35.4pt"><span lang="EN-US" style="font-family:Consolas"> 
<span class="keywordtype">bool</span> </span><span style="font-family:Consolas"><a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html#a1f488b7521f08ced46dce05c44cab5c5"><span lang="EN-US">isVirtual</span></a></span><span lang="EN-US" style="font-family:Consolas">()<span class="keyword">
 const </span>{<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:35.4pt"><a name="l01878"></a><span lang="EN-US" style="font-family:Consolas"> 
</span><span style="font-family:Consolas"><a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html"><span lang="EN-US">CXXMethodDecl</span></a></span><span lang="EN-US" style="font-family:Consolas"> *CD =<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:35.4pt"><a name="l01879"></a><span lang="EN-US" style="font-family:Consolas">  cast<CXXMethodDecl>(<span class="keyword">const_cast<</span></span><span style="font-family:Consolas"><a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html"><span lang="EN-US">CXXMethodDecl</span></a></span><span lang="EN-US" style="font-family:Consolas">*<span class="keyword">></span>(<span class="keyword">this</span>)-></span><span style="font-family:Consolas"><a href="https://clang.llvm.org/doxygen/IndexingContext_8cpp.html#a35cbf522872a806ddf6a0b69a764bb33"><span lang="EN-US">getCanonicalDecl</span></a></span><span lang="EN-US" style="font-family:Consolas">());<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:35.4pt"><a name="l01880"></a><span lang="EN-US" style="font-family:Consolas"> <o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:35.4pt"><a name="l01881"></a><span lang="EN-US" style="font-family:Consolas"> 
<span class="comment">// Member function is virtual if it is marked explicitly so, or if it is</span><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:35.4pt"><a name="l01882"></a><span lang="EN-US" style="font-family:Consolas"> 
<span class="comment">// declared in __interface -- then it is automatically pure virtual.</span><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:35.4pt"><a name="l01883"></a><span lang="EN-US" style="font-family:Consolas"> 
<span class="keywordflow">if</span> (CD-></span><span style="font-family:Consolas"><a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html#adb6ca6181b0ca64bd743d64ff8ad1bb6"><span lang="EN-US">isVirtualAsWritten</span></a></span><span lang="EN-US" style="font-family:Consolas">()
 || CD-></span><span style="font-family:Consolas"><a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html#a0a90a6ef82dce606a80309e43970aee9"><span lang="EN-US">isPure</span></a></span><span lang="EN-US" style="font-family:Consolas">())<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:35.4pt"><a name="l01884"></a><span lang="EN-US" style="font-family:Consolas"> 
<span class="keywordflow">return</span> <span class="keyword">true</span>;<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:35.4pt"><a name="l01885"></a><span lang="EN-US" style="font-family:Consolas"> <o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:35.4pt"><a name="l01886"></a><span lang="EN-US" style="font-family:Consolas"> 
<span class="keywordflow">return</span> (CD-></span><span style="font-family:Consolas"><a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html#a72bcbca3667d9efbc8a031a90472f2fe"><span lang="EN-US">begin_overridden_methods</span></a></span><span lang="EN-US" style="font-family:Consolas">()
 != </span><span style="font-family:Consolas">CD-><a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html#aeecab4c03e5f81230747509b7e70e93e">end_overridden_methods</a>());<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:35.4pt"><a name="l01887"></a><span style="font-family:Consolas">  }<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">In code such as the following:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal" style="margin-left:35.4pt;text-autospace:none"><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:blue">struct</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">Base</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:35.4pt;text-autospace:none"><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">{<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:35.4pt;text-autospace:none"><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">   
</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:blue">virtual</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black"> ~Base();<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:35.4pt;text-autospace:none"><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">};<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:35.4pt;text-autospace:none"><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black"><o:p> </o:p></span></p>
<p class="MsoNormal" style="margin-left:35.4pt;text-autospace:none"><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:blue">struct</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">Derived</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black"> :</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">Base</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:35.4pt;text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">{<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:35.4pt;text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">    ~Derived();<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:35.4pt;text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">};<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">The derived class destructor is virtual, but it is not virtual as written, not pure, and it appears that the list of overridden methods is empty. So the isVirtual function returns false.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Shall I fill a bug report?<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">--- <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Loïc<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
</div>
</body>
</html>