<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Wed, Oct 22, 2014 at 8:32 PM, Jiangning Liu <span dir="ltr"><<a href="mailto:liujiangning1@gmail.com" target="_blank">liujiangning1@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr">Hi Richard,<div><br></div><div>Thanks a lot for your feedback!</div><div><br></div><div>Now I can generate an even smaller test case, so I filed a but at <a href="http://llvm.org/bugs/show_bug.cgi?id=21351" target="_blank">http://llvm.org/bugs/show_bug.cgi?id=21351</a>.</div><div><br></div><div>The small test case is like</div><div><br></div><div>{code}</div><div><div>emplate <int dim> class AA { public: AA(){} };                                                               </div><div><br></div><div>class BB</div><div>{</div><div>public:</div><div>    template <template<int> class C></div><div>    static C<3> fin (const C<3> &);</div><div>};</div><div><br></div><div>AA<3> f(const AA<3> &dof)</div><div>{</div><div>    return BB::fin(dof);</div><div>}</div></div><div>{code}</div><div><br></div><div>I'm not familiar with clang, so what is the term or symbol <span style="font-family:arial,sans-serif;font-size:14px">T0_IXT_EE ? I can't find it in clang source code. Can you explain more? I want to get this bug fixed, and it is blocking my benchmarking work.</span></div></div></blockquote><div><br></div><div>This is part of the Itanium C++ ABI's name mangling scheme. T0_ means "the second template parameter", I ... E denotes a template argument list, X ... E denotes a template argument expression, and T_ means "the first template parameter". So this whole thing means C<n> (where C is the second template parameter and n is the first).</div><div><br></div><div>See <a href="http://mentorembedded.github.io/cxx-abi/abi.html#mangling">http://mentorembedded.github.io/cxx-abi/abi.html#mangling</a> for the gory details.</div><div><br></div><div>A patch that fixes the bug is out for review. =)</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div>Thanks,</div><div>-Jiangning</div></div><div class=""><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">2014-10-23 5:20 GMT+08:00 Richard Smith <span dir="ltr"><<a href="mailto:richard@metafoo.co.uk" target="_blank">richard@metafoo.co.uk</a>></span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><span>On Wed, Oct 22, 2014 at 3:58 AM, Jiangning Liu <span dir="ltr"><<a href="mailto:liujiangning1@gmail.com" target="_blank">liujiangning1@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr">Hi,<br><br>I have a question about C++ name mangling.<div><br></div><div>For the following small program (I failed to get it further minimized), clang++ and g++ generate different symbols for function fin introduced by the last specialization statement.<br><br>clang++: AA<3>::aa BB::fin<3, AA>(AA const&)<br>g++:        AA<3>::aa BB::fin<3, AA>(AA<3> const&)</div></div></blockquote><div><br></div></span><div>Demangled names are not useful when talking about mangling differences. The mangled names are:</div><div><br></div><div>  _ZN2BB3finILi3E2AAEENT0_IXT_EE2aaERKS2_ (from clang)</div><div>  _ZN2BB3finILi3E2AAEENT0_IXT_EE2aaERKS3_ (from gcc)<br></div><div><br></div><div>GCC's mangling appears to be correct here (modulo a bug in the ABI that gives a mangling to an empty <prefix>). S2_ refers to T0_ from the nested-name-specifier in the return type; S3_ refers to T0_IXT_EE, which is what we want in the parameter's type.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span><div dir="ltr"><div>If I change the return type of fin to be void, I can see the argument AA<3> can be correctly generated for clang++.<br><br>{code}<br><div>template <int dim>                                                                                                          <br>class AA<br>{<br>    template <class DH> struct Iter;<br><br>    template <template <int> class DH><br>    struct Iter<DH<3> ><br>    {  <br>        typedef DH<3> AA_type;<br>    };  <br><br>    typedef Iter<AA<dim> > IteratorSelector;<br>public:<br>    typedef typename IteratorSelector::AA_type aa;<br>};<br><br>class BB<br>{<br>    template <int dim, template<int> class C><br>    static typename C<dim>::aa fin (const C<dim> &container);<br><br>    template <int dim><br>    static void pp (const AA<dim>& dof)<br>    {  <br>        typename AA<dim>::aa temp = fin (dof);<br>    }  <br>};<br><br>template void BB::pp<3> (const AA<3>&);<br></div><div>{code}</div><div><br></div><div>So anybody know why?</div><div><br></div><div>This problem will cause failure of linking object files generated by clang++ and g++ separately, and potentially introduce run-time bugs.<div><br></div><div>Thanks,</div><div>-Jiangning</div></div></div></div>
<br></span>_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu" target="_blank">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
<br></blockquote></div><br></div></div>
</blockquote></div><br></div>
</div></div></blockquote></div><br></div></div>