This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: [c++] Another question about demangler output
Gabriel Dos Reis <gdr@integrable-solutions.net> writes:
> Ian Lance Taylor <ian@wasabisystems.com> writes:
>
> [...]
>
> | This gives _ZN2BBcvPFivEEv which (currently) demangles as
> | BB::operator int (*)()()
> |
> | But using a gcc extension, I can do this without a typedef:
> |
> | class BB { operator typeof (int(*)())(); };
> | BB::operator typeof (int(*)())() { return 0; }
>
> If you do that, then you might end up accpeting two different
> declarations as same where the token-oriented scheme (ODR) would have
> kept them separate. That is, you would not be able to differentiate
>
> tu1.C:
>
> struct B { operator typeof(int(*)())(); };
>
> from
>
> tu2.C:
>
> struct B { typedef int (*foo)(); operator foo(); };
>
> ODR says they are different.
I don't know who the ``you'' is in ``if you do that.'' Or else I
don't know what the ``that'' is.
I gave two code samples, and g++ uses the same name mangling for both.
Try it. Is that a bug in g++?
Frankly, I don't see how g++ could do anything else.
If g++ did mangle the names differently, then the demangler would be
able to produce different demanglings for them. Since g++ mangles the
names identically, the demangler must obviously produce the same
demangling for them. I'm proposing that the demangler use the
`typeof' demangling, instead of the ambiguous demangling in which the
typedef has disappeared.
Note that you don't need to use typeof to get identical manglings for
names which you seem to be arguing must be mangled differently. Just
compare
class BB { typedef int I; operator I(); };
and
class BB { operator int(); };
Ian