https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67784
--- Comment #3 from joseph at codesourcery dot com <joseph at codesourcery dot com> --- The reason is as stated in comment#1: it's necessary to examine the token after "if ( 1 ) ;" to see if it's the "else" keyword; if it were "else", that token would be within the C99/C11 block scope of the "for" loop, but if it's something else then it's outside that block scope. But examining it to determine whether it's "else" also classifies it as not a typedef, using information from the wrong scope. So on leaving such a scope for a "for" loop, any previously-lexed identifier token after the loop may need reclassifying based on the correct scope.