[C++ PATCH] Avoid GC during cp_parser_parenthesized_expression_list (PR c++/88180)

Jason Merrill jason@redhat.com
Tue Dec 18 22:29:00 GMT 2018


On 12/18/18 3:49 PM, Jakub Jelinek wrote:
> cp_parser_parenthesized_expression_list creates expression_list in GC
> memory; if it is called when current_function_decl is NULL, there might be
> ggc_collect in the middle of the parsing and collect that vector.
> 
> Fixed by temporarily bumping function_depth.  Or should that be done in some
> other function from this function down to the ggc_collect (the PR has full
> backtrace when that happens)?

> #2  0x0000000000c56d6a in ggc_collect () at ../../gcc/ggc-page.c:2207
> #3  0x0000000000d30095 in cgraph_node::finalize_function (decl=<function_decl 0x7fffefdda200 c>, no_collect=false) at ../../gcc/cgraphunit.c:492
> #4  0x0000000000b18c8c in expand_or_defer_fn (fn=<function_decl 0x7fffefdda200 c>) at ../../gcc/cp/semantics.c:4300
> #5  0x0000000000a34edf in cp_parser_function_definition_after_declarator (parser=0x7ffff7ff6ab0, inline_p=true) at ../../gcc/cp/parser.c:27338
> #6  0x0000000000a375f6 in cp_parser_late_parsing_for_member (parser=0x7ffff7ff6ab0, member_function=<function_decl 0x7fffefdda200 c>)
>     at ../../gcc/cp/parser.c:28215
> #7  0x0000000000a2d75f in cp_parser_class_specifier_1 (parser=0x7ffff7ff6ab0) at ../../gcc/cp/parser.c:23240
> #8  0x0000000000a2d83c in cp_parser_class_specifier (parser=0x7ffff7ff6ab0) at ../../gcc/cp/parser.c:23266

So, we end up calling ggc_collect because we're processing a member 
function in a context where defining a type is not allowed.  One 
solution would be to not do late parsing of members in such a context.

We don't have this problem with lambdas because cp_parser_lambda_body 
already increments function_depth to avoid GC in the middle of an 
expression.

Jason




More information about the Gcc-patches mailing list