Hi, This patch series ultimately supports recent support for extern(Objective-C) functions. However this simple addition exposed two nasty bugs in the process.
This addresses demangling function types. In real symbols, function types are only ever seen following the pointer type symbol 'P'. So this is reflected in both code and tests. Iain.
--- libiberty/ * d-demangle.c (dlang_type): Handle function types only in the context of seeing a pointer type symbol. * testsuite/d-demangle-expected: Update function pointer tests. difVf --git a/libiberty/d-demangle.c b/libiberty/d-demangle.c index 3d7ccf6..9c4d459 100644 --- a/libiberty/d-demangle.c +++ b/libiberty/d-demangle.c @@ -1,5 +1,5 @@ /* Demangler for the D programming language - Copyright 2014, 2015 Free Software Foundation, Inc. + Copyright 2014, 2015, 2016 Free Software Foundation, Inc. Written by Iain Buclaw (ibuc...@gdcproject.org) This file is part of the libiberty library. @@ -533,6 +533,15 @@ dlang_type (string *decl, const char *mangled) } case 'P': /* pointer (T*) */ mangled++; + /* Function pointer types don't include the trailing asterisk. */ + switch (*mangled) + { + case 'F': case 'U': case 'W': + case 'V': case 'R': + mangled = dlang_function_type (decl, mangled); + string_append (decl, "function"); + return mangled; + } mangled = dlang_type (decl, mangled); string_append (decl, "*"); return mangled; @@ -564,13 +573,6 @@ dlang_type (string *decl, const char *mangled) mangled++; return dlang_parse_tuple (decl, mangled); - /* Function types */ - case 'F': case 'U': case 'W': - case 'V': case 'R': - mangled = dlang_function_type (decl, mangled); - string_append (decl, "function"); - return mangled; - /* Basic types */ case 'n': mangled++; diff --git a/libiberty/testsuite/d-demangle-expected b/libiberty/testsuite/d-demangle-expected index 2b1cc4f..11785f2 100644 --- a/libiberty/testsuite/d-demangle-expected +++ b/libiberty/testsuite/d-demangle-expected @@ -390,23 +390,23 @@ _D8demangle4testFDRZaZv demangle.test(extern(C++) char() delegate) # --format=dlang -_D8demangle4testFFZaZv +_D8demangle4testFPFZaZv demangle.test(char() function) # --format=dlang -_D8demangle4testFUZaZv +_D8demangle4testFPUZaZv demangle.test(extern(C) char() function) # --format=dlang -_D8demangle4testFWZaZv +_D8demangle4testFPWZaZv demangle.test(extern(Windows) char() function) # --format=dlang -_D8demangle4testFVZaZv +_D8demangle4testFPVZaZv demangle.test(extern(Pascal) char() function) # --format=dlang -_D8demangle4testFRZaZv +_D8demangle4testFPRZaZv demangle.test(extern(C++) char() function) # --format=dlang @@ -466,59 +466,59 @@ _D8demangle4testFNjNkDFNjZaZv demangle.test(return char() return delegate) # --format=dlang -_D8demangle4testFFNaZaZv +_D8demangle4testFPFNaZaZv demangle.test(char() pure function) # --format=dlang -_D8demangle4testFFNbZaZv +_D8demangle4testFPFNbZaZv demangle.test(char() nothrow function) # --format=dlang -_D8demangle4testFFNcZaZv +_D8demangle4testFPFNcZaZv demangle.test(char() ref function) # --format=dlang -_D8demangle4testFFNdZaZv +_D8demangle4testFPFNdZaZv demangle.test(char() @property function) # --format=dlang -_D8demangle4testFFNeZaZv +_D8demangle4testFPFNeZaZv demangle.test(char() @trusted function) # --format=dlang -_D8demangle4testFFNfZaZv +_D8demangle4testFPFNfZaZv demangle.test(char() @safe function) # --format=dlang -_D8demangle4testFFNiZaZv +_D8demangle4testFPFNiZaZv demangle.test(char() @nogc function) # --format=dlang -_D8demangle4testFFNaNbZaZv +_D8demangle4testFPFNaNbZaZv demangle.test(char() pure nothrow function) # --format=dlang -_D8demangle4testFFNbNaZaZv +_D8demangle4testFPFNbNaZaZv demangle.test(char() nothrow pure function) # --format=dlang -_D8demangle4testFFNdNfNaZaZv +_D8demangle4testFPFNdNfNaZaZv demangle.test(char() @property @safe pure function) # --format=dlang -_D8demangle4testFNjFZaZv +_D8demangle4testFNjPFZaZv demangle.test(char() function) # --format=dlang -_D8demangle4testFNkFZaZv +_D8demangle4testFNkPFZaZv demangle.test(return char() function) # --format=dlang -_D8demangle4testFFNjZaZv +_D8demangle4testFPFNjZaZv demangle.test(char() return function) # --format=dlang -_D8demangle4testFNjNkFNjZaZv +_D8demangle4testFNjNkPFNjZaZv demangle.test(return char() return function) # --format=dlang @@ -989,7 +989,7 @@ object.TypeInfo_Array.argTypes(out TypeInfo, out TypeInfo) # --format=dlang _D2rt6dmain211_d_run_mainUiPPaPUAAaZiZ7tryExecMFMDFZvZv -rt.dmain2._d_run_main(int, char**, extern(C) int(char[][]) function*).tryExec(scope void() delegate) +rt.dmain2._d_run_main(int, char**, extern(C) int(char[][]) function).tryExec(scope void() delegate) # --format=dlang _D6object9Exception6__ctorMFNaNbNfAyaAyamC6object9ThrowableZC9Exception