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.

Reply via email to