Fix declaration_specifiers() handling of typedef name shadowed by NS_SYMBOL
commit2be16aeb8ccd4b05819a3036962010af0c5745d1
authorAl Viro <viro@ftp.linux.org.uk>
Mon, 9 Mar 2009 23:32:26 +0000 (9 23:32 +0000)
committerChristopher Li <sparse@chrisli.org>
Sat, 18 Jul 2009 05:30:09 +0000 (18 05:30 +0000)
tree9e0c48f920bc97773bead30e18e70e6485a3f9cb
parentc14911db43a7229ba7a28ac23f4d1e569a2586ab
Fix declaration_specifiers() handling of typedef name shadowed by NS_SYMBOL

Doing lookup_symbol() with NS_TYPEDEF will happily skip the redeclarations
of the same identifier with NS_SYMBOL.  We need to check that we are not
dealing with something like
typedef int T;
void f(int T)
{
static T a; /* not a valid declaration - T is not a typedef name */
or similar (e.g. enum member shadowing a typedef, etc.).

While we are at it, microoptimize similar code in lookup_type() - instead
of sym->namespace == NS_TYPEDEF we can do sym->namespace & NS_TYPEDEF;
the former will turn into "fetch 32bit value, mask all but 9 bits, compare
with NS_TYPEDEF", the latter - "check that one bit in 32bit value is set".
We never mix NS_TYPEDEF with anything in whatever->namespace, so the
tests are equivalent.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Christopher Li <sparse@chrisli.org>
expression.h
parse.c
validation/typedef_shadow.c [new file with mode: 0644]