https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71688
--- Comment #5 from Martin Jambor <jamborm at gcc dot gnu.org> --- The nesting tree structure contains decls but is built from call graph, in which there are two different cgraph_nodes for a single decl (s). Unnesting is done on call graph again but the translation from decls to nodes of course misses a call graph node which remains to be nested in the graph and that triggers the assert. Fortran FE creates both of those cgraph_nodes. The following backtrace leads to creation of the first one: #0 cgraph_node::create (decl=<function_decl 0x7ffff6a62500 s>) at /home/mjambor/gcc/icln/src/gcc/cgraph.c:495 #1 0x0000000000808b60 in cgraph_node::get_create (decl=<optimized out>) at /home/mjambor/gcc/icln/src/gcc/cgraph.c:529 #2 0x0000000000808d69 in cgraph_node::create (decl=decl@entry=<function_decl 0x7ffff6a62600 _caf_init.1>) at /home/mjambor/gcc/icln/src/gcc/cgraph.c:511 #3 0x00000000006f83ec in generate_coarray_init (ns=ns@entry=0x23d5720) at /home/mjambor/gcc/icln/src/gcc/fortran/trans-decl.c:5086 #4 0x00000000007097cd in gfc_generate_function_code (ns=ns@entry=0x23d5720) at /home/mjambor/gcc/icln/src/gcc/fortran/trans-decl.c:6109 #5 0x000000000070a381 in gfc_generate_contained_functions (parent=parent@entry=0x23d4d60) at /home/mjambor/gcc/icln/src/gcc/fortran/trans-decl.c:5161 #6 0x000000000070978e in gfc_generate_function_code (ns=0x23d4d60) at /home/mjambor/gcc/icln/src/gcc/fortran/trans-decl.c:6100 #7 0x00000000006dc511 in gfc_generate_code (ns=<optimized out>) at /home/mjambor/gcc/icln/src/gcc/fortran/trans.c:2006 #8 0x000000000068da1f in translate_all_program_units (gfc_global_ns_list=0x23d4d60) at /home/mjambor/gcc/icln/src/gcc/fortran/parse.c:5843 #9 0x000000000069426b in gfc_parse_file () at /home/mjambor/gcc/icln/src/gcc/fortran/parse.c:6049 #10 0x00000000006d3e44 in gfc_be_parse_file () at /home/mjambor/gcc/icln/src/gcc/fortran/f95-lang.c:201 #11 0x0000000000c9358d in compile_file () at /home/mjambor/gcc/icln/src/gcc/toplev.c:465 #12 0x0000000000c953b8 in do_compile () at /home/mjambor/gcc/icln/src/gcc/toplev.c:1998 #13 0x0000000000c955eb in toplev::main (this=this@entry=0x7fffffffde50, argc=argc@entry=14, while the following one leads to creation of the second one: #0 cgraph_node::create (decl=decl@entry=<function_decl 0x7ffff6a62500 s>) at /home/mjambor/gcc/icln/src/gcc/cgraph.c:495 #1 0x000000000070a2e1 in gfc_generate_function_code (ns=ns@entry=0x23d5720) at /home/mjambor/gcc/icln/src/gcc/fortran/trans-decl.c:6339 #2 0x000000000070a381 in gfc_generate_contained_functions (parent=parent@entry=0x23d4d60) at /home/mjambor/gcc/icln/src/gcc/fortran/trans-decl.c:5161 #3 0x000000000070978e in gfc_generate_function_code (ns=0x23d4d60) at /home/mjambor/gcc/icln/src/gcc/fortran/trans-decl.c:6100 #4 0x00000000006dc511 in gfc_generate_code (ns=<optimized out>) at /home/mjambor/gcc/icln/src/gcc/fortran/trans.c:2006 #5 0x000000000068da1f in translate_all_program_units (gfc_global_ns_list=0x23d4d60) at /home/mjambor/gcc/icln/src/gcc/fortran/parse.c:5843 #6 0x000000000069426b in gfc_parse_file () at /home/mjambor/gcc/icln/src/gcc/fortran/parse.c:6049 #7 0x00000000006d3e44 in gfc_be_parse_file () at /home/mjambor/gcc/icln/src/gcc/fortran/f95-lang.c:201 #8 0x0000000000c9358d in compile_file () at /home/mjambor/gcc/icln/src/gcc/toplev.c:465 #9 0x0000000000c953b8 in do_compile () at /home/mjambor/gcc/icln/src/gcc/toplev.c:1998 #10 0x0000000000c955eb in toplev::main (this=this@entry=0x7fffffffde50, argc=argc@entry=14, The following seems to be an obvious fix: diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index 2f5e434..0e68736 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -6336,7 +6336,7 @@ gfc_generate_function_code (gfc_namespace * ns) function has already called cgraph_create_node, which also created the cgraph node for this function. */ if (!has_coarray_vars || flag_coarray != GFC_FCOARRAY_LIB) - (void) cgraph_node::create (fndecl); + (void) cgraph_node::get_create (fndecl); } else cgraph_node::finalize_function (fndecl, true);