Hi Richard, Thanks a lot for your feedback!
Now I can generate an even smaller test case, so I filed a but at http://llvm.org/bugs/show_bug.cgi?id=21351. The small test case is like {code} emplate <int dim> class AA { public: AA(){} }; class BB { public: template <template<int> class C> static C<3> fin (const C<3> &); }; AA<3> f(const AA<3> &dof) { return BB::fin(dof); } {code} I'm not familiar with clang, so what is the term or symbol 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. Thanks, -Jiangning 2014-10-23 5:20 GMT+08:00 Richard Smith <[email protected]>: > On Wed, Oct 22, 2014 at 3:58 AM, Jiangning Liu <[email protected]> > wrote: > >> Hi, >> >> I have a question about C++ name mangling. >> >> 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. >> >> clang++: AA<3>::aa BB::fin<3, AA>(AA const&) >> g++: AA<3>::aa BB::fin<3, AA>(AA<3> const&) >> > > Demangled names are not useful when talking about mangling differences. > The mangled names are: > > _ZN2BB3finILi3E2AAEENT0_IXT_EE2aaERKS2_ (from clang) > _ZN2BB3finILi3E2AAEENT0_IXT_EE2aaERKS3_ (from gcc) > > 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. > > >> If I change the return type of fin to be void, I can see the argument >> AA<3> can be correctly generated for clang++. >> >> {code} >> template <int dim> >> >> class AA >> { >> template <class DH> struct Iter; >> >> template <template <int> class DH> >> struct Iter<DH<3> > >> { >> typedef DH<3> AA_type; >> }; >> >> typedef Iter<AA<dim> > IteratorSelector; >> public: >> typedef typename IteratorSelector::AA_type aa; >> }; >> >> class BB >> { >> template <int dim, template<int> class C> >> static typename C<dim>::aa fin (const C<dim> &container); >> >> template <int dim> >> static void pp (const AA<dim>& dof) >> { >> typename AA<dim>::aa temp = fin (dof); >> } >> }; >> >> template void BB::pp<3> (const AA<3>&); >> {code} >> >> So anybody know why? >> >> This problem will cause failure of linking object files generated by >> clang++ and g++ separately, and potentially introduce run-time bugs. >> >> Thanks, >> -Jiangning >> >> _______________________________________________ >> cfe-commits mailing list >> [email protected] >> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >> >> >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
