diff options
author | Al Viro <viro@ftp.linux.org.uk> | 2009-03-09 07:11:48 +0000 |
---|---|---|
committer | Christopher Li <sparse@chrisli.org> | 2009-07-17 23:06:23 +0000 |
commit | 1336f8d679f2ea5d008f202208c96113041ae2a2 (patch) | |
tree | 4864c829e97a6335119abe8caa3d6b5936a27545 | |
parent | Fix handling of typedefs with several declarators (diff) | |
download | sparse-1336f8d679f2ea5d008f202208c96113041ae2a2.tar.gz sparse-1336f8d679f2ea5d008f202208c96113041ae2a2.tar.bz2 sparse-1336f8d679f2ea5d008f202208c96113041ae2a2.zip |
preparations to ->declarator() cleanup - separate typedef handling
Take typedef handling in declaration_specifiers() into separate
branch; kill useless check for qual in case the type we've got
has non-NULL base_type (we'd have already buggered off in that
situation before we get to the check in question).
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Christopher Li <sparse@chrisli.org>
-rw-r--r-- | parse.c | 20 |
1 files changed, 11 insertions, 9 deletions
@@ -1105,29 +1105,31 @@ static struct token *declaration_specifiers(struct token *next, struct decl_stat s = lookup_symbol(ident, NS_TYPEDEF); if (!s) break; - thistype = s->ctype; - mod = thistype.modifiers; if (qual) { if (s->type != SYM_KEYWORD) break; if (!(s->op->type & (KW_ATTRIBUTE | KW_QUALIFIER))) break; } + if (s->ctype.modifiers & MOD_USERTYPE) { + if (ctx->ctype.base_type) + break; + if (ctx->ctype.modifiers & MOD_SPECIFIER) + break; + ctx->ctype.base_type = s->ctype.base_type; + apply_ctype(token->pos, &s->ctype, &ctx->ctype); + continue; + } + thistype = s->ctype; + mod = thistype.modifiers; if (s->type == SYM_KEYWORD && s->op->declarator) { next = s->op->declarator(next, &thistype); mod = thistype.modifiers; } type = thistype.base_type; if (type) { - if (qual) - break; if (ctx->ctype.base_type) break; - /* User types only mix with qualifiers */ - if (mod & MOD_USERTYPE) { - if (ctx->ctype.modifiers & MOD_SPECIFIER) - break; - } ctx->ctype.base_type = type; } |