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