https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103730
--- Comment #1 from Jakub Jelinek <jakub at gcc dot gnu.org> --- What do you find wrong about it? ((logger_msginfo *) & logger)->Fn where logger is a pointer and logger_msginfo is a 2 * sizeof (void*) sized struct does reference the pointer after the logger variable. It is a clear UB. While ((logger_msginfo *) & logger[0])->Fn is dereferencing that pointer and then taking address, so effectively ((logger_msginfo *) logger)->Fn or logger->Fn.