diff options
-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 + */ |