<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>