[cxx-abi-dev] Mangling of function reference

John McCall rjmccall at apple.com
Wed Apr 3 21:58:40 UTC 2013


On Apr 3, 2013, at 8:20 AM, Jason Merrill <jason at redhat.com> wrote:
> On 05/11/2012 09:00 PM, John McCall wrote:
>> -- diff begin --
>>  Empty parameter lists, whether declared as () or conventionally as (void), are encoded with a void parameter specifier (v). Therefore function types always encode at least one parameter type, and function manglings can always be distinguished from data manglings by the presence of the type. Member functions do not encode the types of implicit parameters, either this or the VTT parameter.
>> 
>> -A "Y" prefix for the bare function type encodes extern "C". If there are any cv-qualifiers or a ref-qualifier of this, they are encoded at the beginning of the <qualified-name> as described above. This affects only type mangling, since extern "C" function objects have unmangled names.
>> +When mangling a non-static member function name, if there are any cv-qualifiers or a ref-qualifier of this, they are encoded at the beginning of the <qualified-name> as described above.  When mangling any other function type, if there are any cv-qualifiers or a ref-qualifier, they are encoded as part of the function type as described below.
>> +
>> +A "Y" prefix for the bare function type encodes extern "C" in implementations which distinguish between function types with "C" and "C++" language linkage. This affects only type mangling, since extern "C" function objects have unmangled names.
>> -- diff end --
> 
> We should also clarify whether the modified function type is a substitution candidate.  That is, given
> 
> template <class T, class U> struct A { };
> void f (A<void()const, void()> *){}
> 
> whether f is mangled as
> 
> _Z1fP1AIKFvvES0_E
> or
> _Z1fP1AIKFvvEFvvEE
> 
> G++ currently treats it as a substitution candidate, clang 3.2 does not, and EDG 4.4 neither treats it as a substitution candidate nor mangles the 'const'.
> 
> I think not treating it as a substitution candidate is most consistent with the language rules, and with the mangling rule for pointer to member function types.

This was actually covered in my original proposal:

Therefore I propose the following change:

-- diff begin --
-    <function-type> ::= F [Y] <bare-function-type> E
+    <function-type> ::= [<CV-qualifiers>] F [Y] <bare-function-type> [<ref-qualifier>] E
     <bare-function-type> ::= <signature type>+
         # types are possible return type, then parameter types

+For the purposes of substitution, the CV-qualifiers and ref-qualifier of a function type are an indivisible part of the type;  that is, when mangling 'void () const', 'void ()' is not a substitution candidate.
-- diff end --

> Incidentally, the change above hasn't been applied to the published ABI yet.

Thanks!  I also noticed that Doug's patch for ref-qualifiers from January 2011 hadn't been committed, so I've done that, too.

John.


More information about the cxx-abi-dev mailing list