Quoting gcc/cp/mangle.c@34394:
/* Non-terminal <function-type>. NODE is a FUNCTION_TYPE or
METHOD_TYPE. If INCLUDE_RETURN_TYPE is non-zero, the return type
is mangled before the parameter types.
<function-type> ::= F [Y] <bare-function-type> E */
static void
write_function_type (type, include_return_type)
tree type;
int include_return_type;
{
MANGLE_TRACE_TREE ("function-type", type);
write_char ('F');
/* We don't track whether or not a type is `extern "C"'. Note that
you can have an `extern "C"' function that does not have
`extern "C"' type, and vice versa:
extern "C" typedef void function_t();
function_t f; // f has C++ linkage, but its type is
// `extern "C"'
typedef void function_t();
extern "C" function_t f; // Vice versa.
See [dcl.link]. */
write_bare_function_type (type, include_return_type);
write_char ('E');
}
Is there any rationale for not tracking extern "C"-ness here (beyond:
"its just simpler that way")? I do understand that technically it
doesn't make much of a difference whether a function's type is extern
"C" or not, but it took me by surprise to find this deliberate deviation
from the Itanium ABI.
Stephan