Skip to content

Commit

Permalink
redefinition
Browse files Browse the repository at this point in the history
  • Loading branch information
rui314 committed Dec 7, 2020
1 parent 2ed3fda commit 395308c
Showing 1 changed file with 20 additions and 6 deletions.
26 changes: 20 additions & 6 deletions parse.c
Original file line number Diff line number Diff line change
Expand Up @@ -3163,15 +3163,29 @@ 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");
char *name_str = get_ident(ty->name);

Obj *fn = find_func(name_str);
if (fn) {
// Redeclaration
if (!fn->is_function)
error_tok(tok, "redeclared as a different kind of symbol");
if (fn->is_definition && equal(tok, "{"))
error_tok(tok, "redefinition of %s", name_str);
if (!fn->is_static && attr->is_static)
error_tok(tok, "static declaration follows a non-static declaration");
fn->is_definition = fn->is_definition || equal(tok, "{");
} else {
fn = new_gvar(name_str, ty);
fn->is_function = true;
fn->is_definition = equal(tok, "{");
fn->is_static = attr->is_static || (attr->is_inline && !attr->is_extern);
fn->is_inline = attr->is_inline;
}

Obj *fn = new_gvar(get_ident(ty->name), ty);
fn->is_function = true;
fn->is_definition = !consume(&tok, tok, ";");
fn->is_static = attr->is_static || (attr->is_inline && !attr->is_extern);
fn->is_inline = attr->is_inline;
fn->is_root = !(fn->is_static && fn->is_inline);

if (!fn->is_definition)
if (consume(&tok, tok, ";"))
return tok;

current_fn = fn;
Expand Down

0 comments on commit 395308c

Please sign in to comment.