===================================================================
@@ -288,6 +288,9 @@
/* The const qualifier. The one subtree is the type which is being
qualified. */
DEMANGLE_COMPONENT_CONST,
+ /* extern "C" linkage. The one subtree is the function type which
+ is being qualified. */
+ DEMANGLE_COMPONENT_EXTERN_C,
/* The restrict qualifier modifying a member function. The one
subtree is the type which is being qualified. */
DEMANGLE_COMPONENT_RESTRICT_THIS,
===================================================================
@@ -4151,3 +4151,8 @@
--format=auto
_ZN3Psi7VariantIIcPKcEE5visitIIRZN11VariantTest9TestVisit11test_methodEvEUlS2_E0_RZNS6_11test_methodEvEUlcE1_RZNS6_11test_methodEvEUlNS_4NoneEE_EEENS_13VariantDetail19SelectVisitorResultIIDpT_EE4typeEDpOSG_
Psi::VariantDetail::SelectVisitorResult<VariantTest::TestVisit::test_method()::{lambda(char const*)#2}&, VariantTest::TestVisit::test_method()::{lambda(char)#3}&, VariantTest::TestVisit::test_method()::{lambda(Psi::None)#1}&>::type Psi::Variant<char, char const*>::visit<VariantTest::TestVisit::test_method()::{lambda(char const*)#2}&, VariantTest::TestVisit::test_method()::{lambda(char)#3}&, VariantTest::TestVisit::test_method()::{lambda(Psi::None)#1}&>((VariantTest::TestVisit::test_method()::{lambda(Psi::None)#1}&)...)
+#
+# extern "C" linkage for function types.
+--format=gnu-v3
+_Z1aIFYviEEvPT_
+void a<void (int) extern "C">(void (*)(int) extern "C")
===================================================================
@@ -591,6 +591,9 @@
case DEMANGLE_COMPONENT_CONST:
printf ("const\n");
break;
+ case DEMANGLE_COMPONENT_EXTERN_C:
+ printf ("extern \"C\"\n");
+ break;
case DEMANGLE_COMPONENT_RESTRICT_THIS:
printf ("restrict this\n");
break;
@@ -807,6 +810,7 @@
break;
/* These types only require one parameter. */
+ case DEMANGLE_COMPONENT_EXTERN_C:
case DEMANGLE_COMPONENT_VTABLE:
case DEMANGLE_COMPONENT_VTT:
case DEMANGLE_COMPONENT_TYPEINFO:
@@ -2324,18 +2328,22 @@
d_function_type (struct d_info *di)
{
struct demangle_component *ret;
+ int is_extern_c = 0;
if (! d_check_char (di, 'F'))
return NULL;
if (d_peek_char (di) == 'Y')
{
- /* Function has C linkage. We don't print this information.
- FIXME: We should print it in verbose mode. */
+ /* Function has C linkage. */
+ is_extern_c = 1;
d_advance (di, 1);
+ di->expansion += sizeof "extern \"C\"";
}
ret = d_bare_function_type (di, 1);
if (! d_check_char (di, 'E'))
return NULL;
+ if (is_extern_c)
+ ret = d_make_comp (di, DEMANGLE_COMPONENT_EXTERN_C, ret, NULL);
return ret;
}
@@ -3925,6 +3933,7 @@
case DEMANGLE_COMPONENT_RESTRICT_THIS:
case DEMANGLE_COMPONENT_VOLATILE_THIS:
case DEMANGLE_COMPONENT_CONST_THIS:
+ case DEMANGLE_COMPONENT_EXTERN_C:
case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
case DEMANGLE_COMPONENT_POINTER:
case DEMANGLE_COMPONENT_COMPLEX:
@@ -4537,7 +4546,8 @@
|| (! suffix
&& (mods->mod->type == DEMANGLE_COMPONENT_RESTRICT_THIS
|| mods->mod->type == DEMANGLE_COMPONENT_VOLATILE_THIS
- || mods->mod->type == DEMANGLE_COMPONENT_CONST_THIS)))
+ || mods->mod->type == DEMANGLE_COMPONENT_CONST_THIS
+ || mods->mod->type == DEMANGLE_COMPONENT_EXTERN_C)))
{
d_print_mod_list (dpi, options, mods->next, suffix);
return;
@@ -4628,6 +4638,9 @@
case DEMANGLE_COMPONENT_CONST_THIS:
d_append_string (dpi, " const");
return;
+ case DEMANGLE_COMPONENT_EXTERN_C:
+ d_append_string (dpi, " extern \"C\"");
+ return;
case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
d_append_char (dpi, ' ');
d_print_comp (dpi, options, d_right (mod));
@@ -4711,6 +4724,7 @@
case DEMANGLE_COMPONENT_RESTRICT_THIS:
case DEMANGLE_COMPONENT_VOLATILE_THIS:
case DEMANGLE_COMPONENT_CONST_THIS:
+ case DEMANGLE_COMPONENT_EXTERN_C:
break;
default:
break;