On Wed, 21 Aug 2019, Eric Botcazou wrote: > This fixes a crash of the C compiler when -fdump-ada-spec is passed for: > > extern void (*signal (int __sig, void (*__handler)(int)))(int); > > It appears that the C parser is somewhat confused by this declaration and > builds a FUNCTION_DECL whose type has got 2 arguments (TYPE_ARG_TYPES list) > but which itself has got only 1 argument (DECL_ARGUMENTS list) corresponding > to the anonymous (int) at the end. The C++ parser doesn't have the issue. > > Joseph, is that a known issue of the C parser?
The problem is that the logic in c_parser_declaration_or_fndef for setting DECL_ARGUMENTS (not previously meaningful in non-definition declarations at all), as introduced by r253411 | dmalcolm | 2017-10-04 14:10:59 +0000 (Wed, 04 Oct 2017) | 85 lines C: underline parameters in mismatching function calls (and subsequently changed by r268574, but that change isn't relevant here) is incorrect. Rather than checking if the outermost declarator is cdk_function and using its parameters if so, it's necessary to check if the *innermost declarator that isn't cdk_id or cdk_attrs* is cdk_function and use its parameters if so, as that's what actually determines if the declarator for the entity being declared has the form of a function declarator (see how grokdeclarator determines funcdef_syntax). In your example, the outermost declarator is the one for the target type of the pointer that is the return type. -- Joseph S. Myers jos...@codesourcery.com