diff options
author | Al Viro <viro@ftp.linux.org.uk> | 2009-03-09 23:32:26 +0000 |
---|---|---|
committer | Christopher Li <sparse@chrisli.org> | 2009-07-18 05:30:09 +0000 |
commit | 2be16aeb8ccd4b05819a3036962010af0c5745d1 (patch) | |
tree | 9e0c48f920bc97773bead30e18e70e6485a3f9cb /expression.h | |
parent | Fix enumeration constants' scope beginning (diff) | |
download | sparse-2be16aeb8ccd4b05819a3036962010af0c5745d1.tar.gz sparse-2be16aeb8ccd4b05819a3036962010af0c5745d1.tar.bz2 sparse-2be16aeb8ccd4b05819a3036962010af0c5745d1.zip |
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>
Diffstat (limited to 'expression.h')
-rw-r--r-- | expression.h | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/expression.h b/expression.h index 5136b9b..2e12b12 100644 --- a/expression.h +++ b/expression.h @@ -199,7 +199,7 @@ static inline int lookup_type(struct token *token) { if (token->pos.type == TOKEN_IDENT) { struct symbol *sym = lookup_symbol(token->ident, NS_SYMBOL | NS_TYPEDEF); - return sym && sym->namespace == NS_TYPEDEF; + return sym && (sym->namespace & NS_TYPEDEF); } return 0; } |