https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70418
--- Comment #2 from sasho648 at gmail dot com --- Must be noted that such code must be valid and actually currently working fine and as expected when the function is not nested. Eg.: #include <stdio.h> extern void fp(int a, const struct {int _[a];} *b) { for(size_t i=0; i < sizeof(b->_) / sizeof(b->_[0]); ++i) printf("%d ", b->_[i]); printf("%zu\n", sizeof(b->_)); } void f(int a, struct {int _[a];} b) { for(size_t i=0; i < sizeof(b._) / sizeof(b._[0]); ++i) //modify while retaining the passed argument b._[i] *= 9; fp(a, &b); //prints 81 as many times as 'a' } main(int n, char **pp) { scanf("%i", &n); struct {int _[n];} tmp; for(int i; i < n; ++i) tmp._[i] = 9; ((void (*)(int a, __typeof__(tmp) b))f)(n, tmp); //cast required as VM types aren't equal in the case fp(n, &tmp); //should print 9 as many times as 'n' }