Allow to omit parameter name in function declaration

This commit is contained in:
Rui Ueyama 2020-09-04 17:28:20 +09:00
parent 93d12771d0
commit 1fad2595d6
2 changed files with 24 additions and 4 deletions

View File

@ -73,6 +73,7 @@ struct Obj {
Obj *next;
char *name; // Variable name
Type *ty; // Type
Token *tok; // representative token
bool is_local; // local or global/function
int align; // alignment
@ -241,6 +242,7 @@ struct Type {
// Declaration
Token *name;
Token *name_pos;
// Array
int array_len;

26
parse.c
View File

@ -630,10 +630,17 @@ static Type *declarator(Token **rest, Token *tok, Type *ty) {
return declarator(&tok, start->next, ty);
}
if (tok->kind != TK_IDENT)
error_tok(tok, "expected a variable name");
ty = type_suffix(rest, tok->next, ty);
ty->name = tok;
Token *name = NULL;
Token *name_pos = tok;
if (tok->kind == TK_IDENT) {
name = tok;
tok = tok->next;
}
ty = type_suffix(rest, tok, ty);
ty->name = name;
ty->name_pos = name_pos;
return ty;
}
@ -739,6 +746,8 @@ static Node *declaration(Token **rest, Token *tok, Type *basety, VarAttr *attr)
Type *ty = declarator(&tok, tok, basety);
if (ty->kind == TY_VOID)
error_tok(tok, "variable declared void");
if (!ty->name)
error_tok(ty->name_pos, "variable name omitted");
if (attr && attr->is_static) {
// static local variable
@ -2245,6 +2254,8 @@ static Token *parse_typedef(Token *tok, Type *basety) {
first = false;
Type *ty = declarator(&tok, tok, basety);
if (!ty->name)
error_tok(ty->name_pos, "typedef name omitted");
push_scope(get_ident(ty->name))->type_def = ty;
}
return tok;
@ -2253,6 +2264,8 @@ static Token *parse_typedef(Token *tok, Type *basety) {
static void create_param_lvars(Type *param) {
if (param) {
create_param_lvars(param->next);
if (!param->name)
error_tok(param->name_pos, "parameter name omitted");
new_lvar(get_ident(param->name), param);
}
}
@ -2280,6 +2293,8 @@ static void resolve_goto_labels(void) {
static Token *function(Token *tok, Type *basety, VarAttr *attr) {
Type *ty = declarator(&tok, tok, basety);
if (!ty->name)
error_tok(ty->name_pos, "function name omitted");
Obj *fn = new_gvar(get_ident(ty->name), ty);
fn->is_function = true;
@ -2314,6 +2329,9 @@ static Token *global_variable(Token *tok, Type *basety, VarAttr *attr) {
first = false;
Type *ty = declarator(&tok, tok, basety);
if (!ty->name)
error_tok(ty->name_pos, "variable name omitted");
Obj *var = new_gvar(get_ident(ty->name), ty);
var->is_definition = !attr->is_extern;
var->is_static = attr->is_static;