Re: [cxx-abi-dev] Possibly ambiguous mangling of extern "C" functions
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [cxx-abi-dev] Possibly ambiguous mangling of extern "C" functions
- To: David Vandevoorde <daveed@xxxxxxx>
- Subject: Re: [cxx-abi-dev] Possibly ambiguous mangling of extern "C" functions
- From: Mark Mitchell <mark@xxxxxxxxxxxxxxxx>
- Date: Wed, 20 Aug 2008 09:19:02 +0100
David Vandevoorde wrote:
extern "C" bool IsEmpty(char *); // (un)mangled as IsEmpty
template<bool (&)(char *)> struct CB { static int x; };
// CB<IsEmpty> is mangled as "2CBIL_Z7IsEmptyEE"
int *p = &CB<IsEmpty>::x;
Normally, we issue the following error on that example:
"t.c", line 4: error: a reference of type "bool (&)(char *)" (not
const-qualified) cannot be initialized with a value of type
"bool (char *) C"
Yes, that's the right error. G++ has never implemented extern "C"
function *types*, so doesn't issue this kind of error. There are extern
"C" functions, but the linkage isn't part of the type per se. This is a
known bug.
So, now we're talking about mangling for an invalid C++ program, which
is outside the scope of the ABI.
When I enable the emulation of GCC, we accept it and mangle it as
_ZN2CBIXL_Z7IsEmptyEEE1xE.
We also have a mode to emulate what we consider "GNU ABI bugs". When I
enable that, we generate _ZN2CBIXL7IsEmptyEEE1xE.
The GCC output is actually:
_ZN2CBILZ7IsEmptyEE1xE
Indeed, GCC does not generate the "X...E" form here. Instead, it uses
the expr-primary production directly from the template-arg rule, which
makes sense since there is no complex expression here. However, I do
think that G++ is in error not to omit the underscore before the Z.
--
Mark Mitchell
CodeSourcery
mark@xxxxxxxxxxxxxxxx
(650) 331-3385 x713