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

            Bug ID: 57649
           Summary: [4.7 Regression] ICE in set_is_used
           Product: gcc
           Version: 4.7.3
            Status: UNCONFIRMED
          Keywords: ice-on-valid-code
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jakub at gcc dot gnu.org
                CC: matz at gcc dot gnu.org

void bar (const char *);
void
foo ()
{
  static const char *s = __PRETTY_FUNCTION__;
  struct T { T () { bar (s); } } t;
}

ICEs at -O2 starting with r179618 on 4.7 branch, went away with r187719 for
4.8+.

Similarly C -O2:
void bar (const char *);
void
foo (void)
{
  static const char *s = __PRETTY_FUNCTION__;
  auto void baz (void) { bar (s); }
  baz ();
}

The problem is that the s variable isn't referenced in foo during
*referenced_vars pass, is referenced in another function (nested or local class
method), but at that point the DECL_INITIAL of the var isn't marked, and later
on when the nested/local class method is inlined nothing marks the
DECL_INITIAL.
Perhaps the inliner should somewhere go through all gimple_referenced_vars of
the callee and for each TREE_STATIC var with DECL_CONTEXT of the caller just
call add_referenced_var?

Reply via email to