aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAl Viro <viro@ftp.linux.org.uk>2009-03-09 07:11:48 +0000
committerChristopher Li <sparse@chrisli.org>2009-07-17 23:06:23 +0000
commit1336f8d679f2ea5d008f202208c96113041ae2a2 (patch)
tree4864c829e97a6335119abe8caa3d6b5936a27545
parentFix handling of typedefs with several declarators (diff)
downloadsparse-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.c20
1 files changed, 11 insertions, 9 deletions
diff --git a/parse.c b/parse.c
index 1435fde..ba1a52d 100644
--- a/parse.c
+++ b/parse.c
@@ -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;
}