From 3eaf84bf16706c8b2df9045e65fdf9d5b2bcfea2 Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Sat, 24 Aug 2019 08:26:37 +0900 Subject: [PATCH] Add return that doesn't take any value --- codegen.c | 6 ++++-- parse.c | 5 ++++- tests | 6 ++++++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/codegen.c b/codegen.c index 50c125a..48e70c1 100644 --- a/codegen.c +++ b/codegen.c @@ -506,8 +506,10 @@ static void gen(Node *node) { return; } case ND_RETURN: - gen(node->lhs); - printf(" pop rax\n"); + if (node->lhs) { + gen(node->lhs); + printf(" pop rax\n"); + } printf(" jmp .L.return.%s\n", funcname); return; case ND_CAST: diff --git a/parse.c b/parse.c index 17cd563..6ec767f 100644 --- a/parse.c +++ b/parse.c @@ -1121,7 +1121,7 @@ static Node *stmt(void) { return node; } -// stmt2 = "return" expr ";" +// stmt2 = "return" expr? ";" // | "if" "(" expr ")" stmt ("else" stmt)? // | "switch" "(" expr ")" stmt // | "case" const-expr ":" stmt @@ -1139,6 +1139,9 @@ static Node *stmt(void) { static Node *stmt2(void) { Token *tok; if (tok = consume("return")) { + if (consume(";")) + return new_node(ND_RETURN, tok); + Node *node = new_unary(ND_RETURN, expr(), tok); expect(";"); return node; diff --git a/tests b/tests index 597286b..f255237 100644 --- a/tests +++ b/tests @@ -117,6 +117,10 @@ int fib(int x) { return fib(x-1) + fib(x-2); } +void ret_none() { + return; +} + static int static_fn() { return 3; } int param_decay(int x[]) { return x[0]; } @@ -678,6 +682,8 @@ int main() { assert(3, tree->lhs->lhs->val, "tree->lhs->lhs->val"); assert(4, tree->lhs->rhs->val, "tree->lhs->rhs->val"); + ret_none(); + printf("OK\n"); return 0; } -- GitLab