diff options
author | Al Viro <viro@ftp.linux.org.uk> | 2009-02-14 12:25:15 +0000 |
---|---|---|
committer | Christopher Li <sparse@chrisli.org> | 2009-07-17 23:06:22 +0000 |
commit | 9151897c4a2557382b4a4a64e1e3a0fae41747e0 (patch) | |
tree | 31b3563c8f6bcac673057eb60e38e13a13d47aba | |
parent | Fix handling of ident-less declarations (diff) | |
download | sparse-9151897c4a2557382b4a4a64e1e3a0fae41747e0.tar.gz sparse-9151897c4a2557382b4a4a64e1e3a0fae41747e0.tar.bz2 sparse-9151897c4a2557382b4a4a64e1e3a0fae41747e0.zip |
Separate parsing of identifier-list (in K&R-style declarations)
Don't mix it with parameter-type-list, add saner checks.
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Christopher Li <sparse@chrisli.org>
-rw-r--r-- | parse.c | 28 | ||||
-rw-r--r-- | validation/identifier_list.c | 18 |
2 files changed, 44 insertions, 2 deletions
@@ -1834,12 +1834,36 @@ static struct token *parameter_type_list(struct token *token, struct symbol *fn, return token; } + if (match_op(token, SPECIAL_ELLIPSIS)) { + warning(token->pos, "variadic functions must have one named argument"); + fn->variadic = 1; + return token->next; + } + + if (token_type(token) != TOKEN_IDENT) + return token; + + if (!lookup_type(token)) { + /* K&R */ + for (;;) { + struct symbol *sym = alloc_symbol(token->pos, SYM_NODE); + sym->ident = token->ident; + token = token->next; + sym->endpos = token->pos; + add_symbol(list, sym); + if (!match_op(token, ',') || + token_type(token->next) != TOKEN_IDENT || + lookup_type(token->next)) + break; + token = token->next; + } + return token; + } + for (;;) { struct symbol *sym; if (match_op(token, SPECIAL_ELLIPSIS)) { - if (!*list) - warning(token->pos, "variadic functions must have one named argument"); fn->variadic = 1; token = token->next; break; diff --git a/validation/identifier_list.c b/validation/identifier_list.c new file mode 100644 index 0000000..4691989 --- /dev/null +++ b/validation/identifier_list.c @@ -0,0 +1,18 @@ +typedef int T; +void f(...); +void g(*); +void h(x,int); +void i_OK(T); +void j(x,T); +/* + * check-name: identifier-list parsing + * check-error-start +identifier_list.c:2:8: warning: variadic functions must have one named argument +identifier_list.c:3:8: error: Expected ) in function declarator +identifier_list.c:3:8: error: got * +identifier_list.c:4:9: error: Expected ) in function declarator +identifier_list.c:4:9: error: got , +identifier_list.c:6:9: error: Expected ) in function declarator +identifier_list.c:6:9: error: got , + * check-error-end + */ |