This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [c++] Another question about demangler output


Geoff Keating <geoffk@geoffk.org> writes:

| 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 think it does.

sure, ODR says they are different.

|  It says you can only have one of them in any
| given program,

Precisely!  They are different and cannot simulateneously be present
in a given program.  It is an ODR violation (even if no diagnostic is
required).  If you mangle them differently, then you can catch that
violation. 

-- Gaby


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]