Restrict the contexts in which typedef names can appear.
This should resolve a rather nasty ambiguity in the C grammar:
[declaration] -> [declaration-specifiers] ;
-> [type-specifier] [declaration-specifiers] ;
-> int [declaration-specifiers] ;
-> int [type-specifier] ;
-> int [typedef-name] ;
-> int [identifier] ;
-> int x ;
versus
[declaration] -> [declaration-specifiers] [init-declarator-list] ;
-> [type-specifier] [init-declarator-list] ;
-> int [init-declarator-list] ;
-> int [init-declarator] ;
-> int [declarator] ;
-> int [direct-declarator] ;
-> int [identifier] ;
-> int x ;
The standard resolves this ambiguity by having a constraint that is not
part of the context-free grammar. This ambiguity gets really nasty with
things like int f (x); -- is it a declaration of x with two type
specifiers or a declaration of f (a function with one parameter) with
with one type specifier?
A side-effect of this change is that the parser will now reject
declarations without any type specifiers at all, which probably makes
the error messages a bit less informative.