[Bug c++/68265] Arbitrary syntactic nonsense silently accepted after 'int (*){}' until the next close brace
miyuki at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Sun Dec 27 17:49:00 GMT 2015
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.
More information about the Gcc-bugs
mailing list