https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94947
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |ASSIGNED Target Milestone|--- |8.5 Assignee|unassigned at gcc dot gnu.org |rguenth at gcc dot gnu.org --- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> --- Confirmed. It's a little tricky but I think it boils down to extern void abort (); extern void baz (); extern void (*baz_call)(); static int *p; static void foo () { if (*p != 1) abort (); } int main() { int x = 1; p = &x; baz_call = foo; baz (); return 0; } --- void (*baz_call)(); void baz () { baz_call (); } and the issue being that escaping foo at baz_call = foo does not escape foos call uses/clobbers.