<div dir="ltr">I don't believe this code is valid according to C++. I believe it would require an explicit instantiation of the ctor/dtor somewhere to make that code valid - though I don't have chapter and verse on the spec at hand just now to back that up.</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Apr 17, 2020 at 6:54 AM Jaroslav Zeman via cfe-users <<a href="mailto:cfe-users@lists.llvm.org">cfe-users@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hello,<br>
<br>
I've run into wieird problem when trying to compile and link our programs with <br>
clang++ on linux instead of g++. It occurs, when:<br>
 - template class member definitions are separated from the definition of the <br>
class<br>
- no explicit instantiation is done<br>
- member definitions are available only in some of the units, where the <br>
template is being used.<br>
(Yeah, our code is a mess)<br>
<br>
This is simple expamle:<br>
// ----- template.h --------<br>
template< typename T ><br>
struct Template {<br>
  Template();<br>
  ~Template();<br>
};<br>
<br>
void doSomething(Template<int>& t);<br>
<br>
// ----- template.cpp --------<br>
#include "template.h"<br>
<br>
template< typename T ><br>
Template< T >::Template() { }<br>
<br>
template< typename T><br>
Template< T >::~Template() { }<br>
<br>
void doSomething(Template<int>& t) {<br>
  Template<int> new_t;<br>
  t = new_t;<br>
}<br>
<br>
// ----- main.cpp --------<br>
#include "template.h"<br>
<br>
int main(int argc_, char** argv_) {<br>
<br>
  Template<int> t;<br>
  doSomething(t);<br>
<br>
  return 0;<br>
}<br>
// ----- end of code<br>
<br>
When compiled with clang++:<br>
$ clang++ -o test main.cpp template.cpp <br>
/usr/bin/ld: /tmp/main-e2fa2c.o: in function `main':<br>
main.cpp:(.text+0x2f): undefined reference to `Template<int>::Template()'<br>
/usr/bin/ld: main.cpp:(.text+0x4d): undefined reference to <br>
`Template<int>::~Template()'<br>
/usr/bin/ld: main.cpp:(.text+0x82): undefined reference to <br>
`Template<int>::~Template()'<br>
<br>
reading the object files using nm tool shows, the symbol for destructor <br>
instantiated in template.cpp is _ZN8TemplateIiED2Ev, but the main.o requires <br>
symbol _ZN8TemplateIiED1Ev. Notice the difference in one digit: D2 vs D1.<br>
<br>
So symbol ...D1... is required, but only ...D2... is available. The D1 version <br>
is generated by clang only for explicit instantiation. g++ generates both D1 <br>
and D2 for any type of instantiation.<br>
<br>
Can this be considered a bug of clang++? Or does this behaior have some <br>
purpose?<br>
<br>
Regards,<br>
JZ<br>
<br>
<br>
_______________________________________________<br>
cfe-users mailing list<br>
<a href="mailto:cfe-users@lists.llvm.org" target="_blank">cfe-users@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-users" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-users</a><br>
</blockquote></div>