https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77754
--- Comment #9 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Though, it seems they can be hiding pretty much everywhere: int fn3(); void (**fn5) (int[][fn3 ()]); void fn1 () { int a[10][fn3 ()]; (**fn5) (a); } ICEs with -O2 -flto, so does: int fn3(); typedef void (*fn6) (int[][fn3 ()]); fn6 **fn7; void fn1 () { int a[10][fn3 ()]; (**fn7) (a); } and so does: int fn3(); typedef void (*fn6) (int[][fn3 ()]); struct S { fn6 **fn7; fn6 *fn8; fn6 fn9; } s; void fn1 () { int a[10][fn3 ()]; (**s.fn7) (a); (*s.fn8) (a); s.fn9 (a); } So I'd think trying to fix it up late is just too late, we want to change it immediately after finishing a declaration that is not a function definition.