summaryrefslogtreecommitdiff
path: root/parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'parser.c')
-rw-r--r--parser.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/parser.c b/parser.c
index 42a7f49..e078ae9 100644
--- a/parser.c
+++ b/parser.c
@@ -268,7 +268,11 @@ static void parse_var_decl(struct var_decl_node* p_node) {
parse_type(&p_node->type);
expect(TK_IDENT);
p_node->ident = tok.data.ident;
- scope_define_var(scope, (struct var_def) { .name = p_node->ident });
+ scope_define_var(scope, (struct var_def) {
+ .name = p_node->ident,
+ .loc.type = STO_UNRESOLVED,
+ .sz = 0, /* unknown */
+ });
}
static void parse_stmt(struct stmt_node* p_node);
@@ -389,10 +393,7 @@ static void parse_fn_decl(struct fn_decl_node* p_node) {
expect(TK_RPAREN);
- parse_group(&p_node->body);
-
- scope_pop(&scope);
-
+ /* defining here makes recursion possible */
scope_define_var(scope, (struct var_def) {
.name = p_node->name,
.loc = {
@@ -400,6 +401,10 @@ static void parse_fn_decl(struct fn_decl_node* p_node) {
.decl = p_node,
},
});
+
+ parse_group(&p_node->body);
+
+ scope_pop(&scope);
}
static bool parse_root(struct root_node* p_node) {