2018-12-27 Joern Rennecke * cp/parser.c: (expression_list_ref): New GTY variable. (cp_parser_parenthesized_expression_list): Make it reference expression_list. Index: gcc/cp/parser.c =================================================================== --- gcc/cp/parser.c (revision 5644) +++ gcc/cp/parser.c (revision 5645) @@ -7649,6 +7649,14 @@ cp_parser_postfix_dot_deref_expression ( return postfix_expression; } +/* When processing a member function, cgraph_node::finalize_function can + call ggc_collect (like if called by expand_or_defer_fn from a struct + member function with (function_depth <= 1)). + Prevent expression_list in cp_parser_parenthesized_expression_list to + be garbage collected then by referencing it from a GC root. */ +typedef vec *tree_gc_vec; +static GTY(()) vec *expression_list_ref; + /* Parse a parenthesized expression-list. expression-list: @@ -7705,6 +7713,7 @@ cp_parser_parenthesized_expression_list return NULL; expression_list = make_tree_vector (); + vec_safe_push (expression_list_ref, expression_list); /* Within a parenthesized expression, a `>' token is always the greater-than operator. */ @@ -7797,6 +7806,8 @@ cp_parser_parenthesized_expression_list cp_lexer_consume_token (parser->lexer); } + expression_list_ref->pop (); + if (close_paren_loc) *close_paren_loc = cp_lexer_peek_token (parser->lexer)->location;