[cxx-abi-dev] Mangling of function-to-pointer conversion

Mike Herrick mjh at edg.com
Wed Jan 4 16:42:04 UTC 2012


On Jan 4, 2012, at 9:58 AM, Jason Merrill wrote:

> On 03/04/2011 12:17 PM, Jason Merrill wrote:
>> A related case:
>> 
>> template<typename T> int cmp1(T a, T b);
>> template<typename T> int cmp2(T a, T b);
>> template<typename T, int (*cmp)(T, T)> struct A { };
>> template <typename T> void f (A<T,cmp1> &);
>> void g()
>> {
>>  A<char,cmp1> a;
>>  f(a);
>> }
>> 
>> How do we mangle 'cmp1' in the signature of f? The ABI doesn't say
>> anything specific about how to mangle unresolved overloading.
>> 
>> G++ currently crashes on this testcase, but some obvious fixes lead it
>> to generate "4cmp1", i.e. <unresolved-name>, which seems consistent with
>> the mangling in a dependent call.
> 
>> EDG 4.2 mangles it as adL_Z4cmp1, which doesn't seem to match anything
>> in the spec; it seems to be treating the cmp1 template as an extern "C"
>> function.
> 
> Clang also produces 4cmp1 for this testcase.  Curiously, if I adjust the testcase to
> 
> template<typename T> int cmp1(T a, T b);
> int cmp2(char a, char b);
> template<typename T, int (*cmp)(T, T)> struct A { };
> template <typename T> void f (A<T,cmp1> &);
> template <typename T> void f (A<T,cmp2> &);
> void g()
> {
>  A<char,cmp1> a;
>  f(a);
>  A<char,cmp2> a2;
>  f(a2);
> }
> 
> For the second F I get three different results from the three compilers:
> 
> EDG gives _Z1fIcEvR1AIT_XadL_Z4cmp2ccEEE, which is consistent with its treatment of the cmp1 case (i.e. adding the unwritten address operation).

We agree that <unresolved-name> is the way to go here.

Mike Herrick
Edison Design Group

> 
> G++ with my patch gives _Z1fIcEvR1AIT_L_Z4cmp2ccEE, treating cmp2 as a simple literal.
> 
> Clang gives _Z1fIcEvR1AIT_XL_Z4cmp2ccEEE, wrapping the literal in the X/E expression delimiters.  This seems like a bug.
> 
>> I tried to create an analogous dependent call to see what it
>> would do in that case:
>> 
>> template <class T, int I> struct B { };
>> template <class T> void h(B<T,sizeof(cmp1(T(),T()))>);
>> 
>> void i()
>> {
>>  B<int,sizeof(int)> b;
>>  h(b);
>> }
>> 
>> but EDG 4.2 rejects this testcase.
> 
> EDG 4.3 produces _Z1hIiEv1BIT_Xszcl4cmp1cvS1__EcvS1__EEEE for this testcase, as do GCC and Clang.
> 
> Jason




More information about the cxx-abi-dev mailing list