[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