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?