Add return that doesn't take any value

This commit is contained in:
Rui Ueyama 2020-08-27 22:01:34 +09:00
parent 127056dc1d
commit 30b3e216cd
3 changed files with 12 additions and 2 deletions

View File

@ -433,7 +433,8 @@ static void gen_stmt(Node *node) {
gen_stmt(node->lhs);
return;
case ND_RETURN:
gen_expr(node->lhs);
if (node->lhs)
gen_expr(node->lhs);
println(" jmp .L.return.%s", current_fn->name);
return;
case ND_EXPR_STMT:

View File

@ -1050,7 +1050,7 @@ static bool is_typename(Token *tok) {
return find_typedef(tok);
}
// stmt = "return" expr ";"
// stmt = "return" expr? ";"
// | "if" "(" expr ")" stmt ("else" stmt)?
// | "switch" "(" expr ")" stmt
// | "case" const-expr ":" stmt
@ -1066,6 +1066,9 @@ static bool is_typename(Token *tok) {
static Node *stmt(Token **rest, Token *tok) {
if (equal(tok, "return")) {
Node *node = new_node(ND_RETURN, tok);
if (consume(rest, tok->next, ";"))
return node;
Node *exp = expr(&tok, tok->next);
*rest = skip(tok, ";");

View File

@ -61,6 +61,10 @@ int counter() {
return i++ + j++;
}
void ret_none() {
return;
}
int main() {
ASSERT(3, ret3());
ASSERT(8, add2(3, 5));
@ -100,6 +104,8 @@ int main() {
ASSERT(4, counter());
ASSERT(6, counter());
ret_none();
printf("OK\n");
return 0;
}