[c++] Another question about demangler output

Ian Lance Taylor ian@wasabisystems.com
Sun Dec 7 04:28:00 GMT 2003


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



More information about the Gcc mailing list