<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=us-ascii">
<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;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0in;
margin-bottom:.0001pt;
font-size:11.0pt;
font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:#0563C1;
text-decoration:underline;}
span.EmailStyle19
{mso-style-type:personal-compose;
font-family:"Calibri",sans-serif;
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;
font-family:"Calibri",sans-serif;}
@page WordSection1
{size:8.5in 11.0in;
margin:1.0in 1.0in 1.0in 1.0in;}
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="EN-US" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:14.0pt">The following test case fails to compile with clang++ because it does not generate code for a destructor (as indicated below). Is this a bug or am I missing something? Gcc works fine.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt">Wandbox permlink: <a href="https://wandbox.org/permlink/H7BcjQzXwoqZclj3">
https://wandbox.org/permlink/H7BcjQzXwoqZclj3</a><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt">// prog.cpp<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt">#include "D.h"<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt">D *f(char c) {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"> return c ? new D(c) : new D(-1);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt">}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt">D *x;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt">int main() {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"> x = f('a');<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"> return 0;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt">}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt">// D.h<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt">#ifndef D_H<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt">#define D_H<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt">extern void unknown();<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt">template<typename T><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt">class C {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"> T t;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt">public:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"> explicit C(T t_) : t(t_) {}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"> ~C() {}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt">};<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt">class D {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"> union U<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"> {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"> explicit U(int i) : ci(i) { unknown(); }<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"> explicit U(char c) : cc(c) {}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"> ~U() {}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"> C<int> ci; // destructor C<int>::~C() not generated<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"> C<char> cc; <o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"> };<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"> U u;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"> bool uIsInt;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt">public:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"> explicit D(int i) : u(i), uIsInt(true) {}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"> explicit D(char c) : u(c), uIsInt(false) {}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"> ~D(); // explicit destruction of u<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt">};<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt">D* f(char c);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt">#endif // D_H<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt">// unk.cpp<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt">#include "D.h"<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt">void unknown() {}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt">D::~D() {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"> if (uIsInt)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"> u.ci.~C();<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"> else<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"> u.cc.~C();<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt">}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt">$ clang++ prog.cpp unk.cpp<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt">/tmp/prog-bfa5e6.o: In function `D::U::U(int)':<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt">prog.cc:(.text._ZN1D1UC2Ei[_ZN1D1UC2Ei]+0x3e): undefined reference to `C<int>::~C()'<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt">clang-11: error: linker command failed with exit code 1 (use -v to see invocation)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"><o:p></o:p></span></p>
</div>
</body>
</html>