https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68265
Mikhail Maltsev <miyuki at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Last reconfirmed| |2015-12-27 CC| |miyuki at gcc dot gnu.org Ever confirmed|0 |1 --- Comment #3 from Mikhail Maltsev <miyuki at gcc dot gnu.org> --- It looks like after parsing "int (*" we expect an identifier, but for some reason the following error gets discarded: #0 cp_parser_simulate_error (parser=parser@entry=0x7ffff7ff5ab0) at /home/miyuki/gcc/src/gcc/cp/parser.c:2879 #1 0x00000000007598b7 in cp_parser_error (parser=parser@entry=0x7ffff7ff5ab0, gmsgid=gmsgid@entry=0x1881525 "expected unqualified-id") at /home/miyuki/gcc/src/gcc/cp/parser.c:2741 #2 0x000000000076f949 in cp_parser_unqualified_id (parser=parser@entry=0x7ffff7ff5ab0, template_keyword_p=template_keyword_p@entry=false, check_dependency_p=check_dependency_p@entry=true, declarator_p=declarator_p@entry=true, optional_p=optional_p@entry=false) at /home/miyuki/gcc/src/gcc/cp/parser.c:5755 #3 0x000000000076fc16 in cp_parser_id_expression (parser=parser@entry=0x7ffff7ff5ab0, template_keyword_p=template_keyword_p@entry=false, check_dependency_p=check_dependency_p@entry=false, template_p=template_p@entry=0x0, declarator_p=declarator_p@entry=true, optional_p=false) at /home/miyuki/gcc/src/gcc/cp/parser.c:5430 #4 0x000000000076fd92 in cp_parser_declarator_id (parser=parser@entry=0x7ffff7ff5ab0, optional_p=optional_p@entry=false) at /home/miyuki/gcc/src/gcc/cp/parser.c:19782 #5 0x0000000000771987 in cp_parser_direct_declarator (parser=parser@entry=0x7ffff7ff5ab0, dcl_kind=dcl_kind@entry=CP_PARSER_DECLARATOR_NAMED, ctor_dtor_or_conv_p=ctor_dtor_or_conv_p@entry=0x0, member_p=member_p@entry=false, friend_p=friend_p@entry=false) at /home/miyuki/gcc/src/gcc/cp/parser.c:19069 #6 0x0000000000772670 in cp_parser_declarator (parser=parser@entry=0x7ffff7ff5ab0, dcl_kind=dcl_kind@entry=CP_PARSER_DECLARATOR_NAMED, ctor_dtor_or_conv_p=ctor_dtor_or_conv_p@entry=0x0, parenthesized_p=parenthesized_p@entry=0x0, member_p=member_p@entry=false, friend_p=friend_p@entry=false) at /home/miyuki/gcc/src/gcc/cp/parser.c:18734 #7 0x00000000007725ac in cp_parser_declarator (parser=parser@entry=0x7ffff7ff5ab0, dcl_kind=dcl_kind@entry=CP_PARSER_DECLARATOR_NAMED, ctor_dtor_or_conv_p=ctor_dtor_or_conv_p@entry=0x7fffffffddf8, parenthesized_p=parenthesized_p@entry=0x0, member_p=member_p@entry=false, friend_p=friend_p@entry=false) at /home/miyuki/gcc/src/gcc/cp/parser.c:18713 #8 0x000000000077164a in cp_parser_direct_declarator (parser=parser@entry=0x7ffff7ff5ab0, dcl_kind=dcl_kind@entry=CP_PARSER_DECLARATOR_NAMED, ctor_dtor_or_conv_p=ctor_dtor_or_conv_p@entry=0x7fffffffddf8, member_p=member_p@entry=false, friend_p=friend_p@entry=false) at /home/miyuki/gcc/src/gcc/cp/parser.c:18962 #9 0x0000000000772670 in cp_parser_declarator (parser=parser@entry=0x7ffff7ff5ab0, dcl_kind=dcl_kind@entry=CP_PARSER_DECLARATOR_NAMED, ctor_dtor_or_conv_p=ctor_dtor_or_conv_p@entry=0x7fffffffddf8, parenthesized_p=parenthesized_p@entry=0x0, member_p=member_p@entry=false, friend_p=friend_p@entry=false) at /home/miyuki/gcc/src/gcc/cp/parser.c:18734 #10 0x0000000000794d4b in cp_parser_init_declarator (parser=parser@entry=0x7ffff7ff5ab0, decl_specifiers=decl_specifiers@entry=0x7fffffffde80, checks=checks@entry=0x0, function_definition_allowed_p=function_definition_allowed_p@entry=false, member_p=member_p@entry=false, declares_class_or_enum=0, function_definition_p=0x7fffffffde77, maybe_range_for_decl=0x0, init_loc=0x7fffffffde78) at /home/miyuki/gcc/src/gcc/cp/parser.c:18281 #11 0x000000000079592e in cp_parser_simple_declaration (parser=parser@entry=0x7ffff7ff5ab0, function_definition_allowed_p=function_definition_allowed_p@entry=false, maybe_range_for_decl=maybe_range_for_decl@entry=0x0) at /home/miyuki/gcc/src/gcc/cp/parser.c:12331 #12 0x000000000079602b in cp_parser_block_declaration (parser=0x7ffff7ff5ab0, statement_p=statement_p@entry=true) at /home/miyuki/gcc/src/gcc/cp/parser.c:12200 #13 0x00000000007960ac in cp_parser_declaration_statement (parser=parser@entry=0x7ffff7ff5ab0) at /home/miyuki/gcc/src/gcc/cp/parser.c:11812 #14 0x0000000000769343 in cp_parser_statement (parser=parser@entry=0x7ffff7ff5ab0, in_statement_expr=in_statement_expr@entry=<tree 0x0>, in_compound=in_compound@entry=true, if_p=if_p@entry=0x0, chain=chain@entry=0x0) at /home/miyuki/gcc/src/gcc/cp/parser.c:10494 #15 0x000000000076956a in cp_parser_statement_seq_opt (parser=parser@entry=0x7ffff7ff5ab0, in_statement_expr=in_statement_expr@entry=<tree 0x0>) at /home/miyuki/gcc/src/gcc/cp/parser.c:10772 #16 0x00000000007696fa in cp_parser_compound_statement (parser=0x7ffff7ff5ab0, in_statement_expr=in_statement_expr@entry=<tree 0x0>, bcs_flags=<optimized out>, function_body=function_body@entry=true) at /home/miyuki/gcc/src/gcc/cp/parser.c:10726 #17 0x0000000000769746 in cp_parser_function_body (parser=parser@entry=0x7ffff7ff5ab0, in_function_try_block=in_function_try_block@entry=false) at /home/miyuki/gcc/src/gcc/cp/parser.c:20596 #18 0x0000000000794581 in cp_parser_ctor_initializer_opt_and_function_body (parser=parser@entry=0x7ffff7ff5ab0, in_function_try_block=in_function_try_block@entry=false) at /home/miyuki/gcc/src/gcc/cp/parser.c:20632 #19 0x0000000000794a38 in cp_parser_function_definition_after_declarator (parser=parser@entry=0x7ffff7ff5ab0, inline_p=inline_p@entry=false) at /home/miyuki/gcc/src/gcc/cp/parser.c:25259 #20 0x0000000000794c46 in cp_parser_function_definition_from_specifiers_and_declarator (parser=parser@entry=0x7ffff7ff5ab0, decl_specifiers=decl_specifiers@entry=0x7fffffffe260, attributes=attributes@entry=<tree 0x0>, declarator=declarator@entry=0x25385c0) at /home/miyuki/gcc/src/gcc/cp/parser.c:25171 #21 0x0000000000794f5b in cp_parser_init_declarator (parser=parser@entry=0x7ffff7ff5ab0, decl_specifiers=decl_specifiers@entry=0x7fffffffe260, checks=checks@entry=0x0, function_definition_allowed_p=function_definition_allowed_p@entry=true, member_p=member_p@entry=false, declares_class_or_enum=<optimized out>, function_definition_p=0x7fffffffe257, maybe_range_for_decl=0x0, init_loc=0x7fffffffe258) at /home/miyuki/gcc/src/gcc/cp/parser.c:18372 #22 0x000000000079592e in cp_parser_simple_declaration (parser=parser@entry=0x7ffff7ff5ab0, function_definition_allowed_p=function_definition_allowed_p@entry=true, maybe_range_for_decl=maybe_range_for_decl@entry=0x0) at /home/miyuki/gcc/src/gcc/cp/parser.c:12331 #23 0x000000000079602b in cp_parser_block_declaration (parser=parser@entry=0x7ffff7ff5ab0, statement_p=statement_p@entry=false) at /home/miyuki/gcc/src/gcc/cp/parser.c:12200 #24 0x00000000007a0878 in cp_parser_declaration (parser=parser@entry=0x7ffff7ff5ab0) at /home/miyuki/gcc/src/gcc/cp/parser.c:12097 #25 0x000000000079f202 in cp_parser_declaration_seq_opt (parser=parser@entry=0x7ffff7ff5ab0) at /home/miyuki/gcc/src/gcc/cp/parser.c:11976 #26 0x000000000079f287 in cp_parser_translation_unit (parser=0x7ffff7ff5ab0) at /home/miyuki/gcc/src/gcc/cp/parser.c:4299 #27 0x000000000079f391 in c_parse_file () at /home/miyuki/gcc/src/gcc/cp/parser.c:37337 #28 0x0000000000958a52 in c_common_parse_file () at /home/miyuki/gcc/src/gcc/c-family/c-opts.c:1064 #29 0x0000000000e659b5 in compile_file () at /home/miyuki/gcc/src/gcc/toplev.c:464 #30 0x0000000000e67724 in do_compile () at /home/miyuki/gcc/src/gcc/toplev.c:1985 #31 0x0000000000e67906 in toplev::main (this=this@entry=0x7fffffffe4b0, argc=argc@entry=2, argv=argv@entry=0x7fffffffe5b8) at /home/miyuki/gcc/src/gcc/toplev.c:2092 #32 0x000000000177828f in main (argc=2, argv=0x7fffffffe5b8) at /home/miyuki/gcc/src/gcc/main.c:39 After that cp_parser_declarator returns cp_error_declarator and it gets wrapped by cp_parser_make_indirect_declarator inside another cp_declarator. Something like this diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 4829a77..4b6cea6 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -18711,6 +18711,8 @@ cp_parser_declarator (cp_parser* parser, /*parenthesized_p=*/NULL, /*member_p=*/false, friend_p); + if (declarator == cp_error_declarator) + return cp_error_declarator; /* If we are parsing an abstract-declarator, we must handle the case where the dependent declarator is absent. */ seems to help.