A question about C++ mangling for a complicated template case
Jiangning Liu
liujiangning1 at gmail.com
Wed Oct 22 20:32:41 PDT 2014
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 <richard at metafoo.co.uk>:
> On Wed, Oct 22, 2014 at 3:58 AM, Jiangning Liu <liujiangning1 at gmail.com>
> 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
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20141023/0f2f59f2/attachment.html>
More information about the cfe-commits
mailing list