[Bug lto/50747] [4.7 Regression] ICE in produce_symtab, at lto-streamer-out.c:1435

rguenth at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Wed Dec 7 16:14:00 GMT 2011


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50747

--- Comment #5 from Richard Guenther <rguenth at gcc dot gnu.org> 2011-12-07 16:13:14 UTC ---
The function in question is DECL_ABSTRACT (it's one of the B::B constructors).
Not sure why we have a cgraph node for it at all:

#0  cgraph_create_node (decl=0x7ffff5b92500)
    at /space/rguenther/src/svn/trunk/gcc/cgraph.c:495
#1  0x00000000009b6878 in cgraph_get_create_node (decl=0x7ffff5b92500)
    at /space/rguenther/src/svn/trunk/gcc/cgraph.c:543
#2  0x00000000008c3303 in c_genericize (fndecl=0x7ffff5b92500)
    at /space/rguenther/src/svn/trunk/gcc/c-family/c-gimplify.c:101
#3  0x0000000000858e0a in cp_genericize (fndecl=0x7ffff5b92500)
    at /space/rguenther/src/svn/trunk/gcc/cp/cp-gimplify.c:1172
#4  0x0000000000547836 in finish_function (flags=0)
    at /space/rguenther/src/svn/trunk/gcc/cp/decl.c:13478
#5  0x0000000000769a05 in synthesize_method (fndecl=0x7ffff5b92500)
    at /space/rguenther/src/svn/trunk/gcc/cp/method.c:774
#6  0x000000000068fd62 in mark_used (decl=0x7ffff5b92600)
    at /space/rguenther/src/svn/trunk/gcc/cp/decl2.c:4372
#7  0x00000000004d0a88 in build_over_call (cand=0x1f33fd0, flags=3, complain=3)
    at /space/rguenther/src/svn/trunk/gcc/cp/call.c:6727
#8  0x00000000004d590c in build_new_method_call_1 (instance=0x7ffff5a2c1e0, 
    fns=0x7ffff5b79a80, args=0x7fffffffcc50, conversion_path=0x7ffff5b8c340, 
    flags=3, fn_p=0x0, complain=3)
    at /space/rguenther/src/svn/trunk/gcc/cp/call.c:7337

The following fixes the ICE for Volkers testcase, but not the original
from Markus:

@@ -1431,8 +1444,9 @@ produce_symtab (struct output_block *ob,
         table: they end up being undefined and just consume space.  */
       if (!node->address_taken && !node->callers)
        {
-         gcc_assert (node->analyzed);
-         gcc_assert (DECL_DECLARED_INLINE_P (node->decl));
+         gcc_assert ((node->analyzed
+                      && DECL_DECLARED_INLINE_P (node->decl))
+                     || DECL_ABSTRACT (node->decl));
          continue;
        }
       if (DECL_COMDAT (node->decl)

why assert anything at all here?  That is, that's the fix I'd do:

@@ -1430,11 +1443,7 @@ produce_symtab (struct output_block *ob,
         them indirectly or via vtables.  Do not output them to symbol
         table: they end up being undefined and just consume space.  */
       if (!node->address_taken && !node->callers)
-       {
-         gcc_assert (node->analyzed);
-         gcc_assert (DECL_DECLARED_INLINE_P (node->decl));
-         continue;
-       }
+       continue;
       if (DECL_COMDAT (node->decl)
          && cgraph_comdat_can_be_unshared_p (node))
        continue;



More information about the Gcc-bugs mailing list