mirror of https://github.com/rui314/chibicc
Allow to omit parameter name in function declaration
This commit is contained in:
parent
93d12771d0
commit
1fad2595d6
|
@ -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
26
parse.c
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue