From bd5bbdebf116bb03da335d0e18a55a5597b55548 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Tue, 29 Jul 2025 06:04:29 +0900 Subject: feat: function main() now returns zero if no return value are explicitly provided --- codegen.c | 4 ++++ main.c | 1 - tests/064.sh | 22 ++++++++++++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 tests/064.sh diff --git a/codegen.c b/codegen.c index 2240b22..d290e95 100644 --- a/codegen.c +++ b/codegen.c @@ -437,6 +437,10 @@ void codegen_func(CodeGen* g, AstNode* ast) { codegen_func_prologue(g, ast); codegen_stmt(g, ast->node_body); + if (string_equals_cstr(&ast->name, "main")) { + // C99: 5.1.2.2.3 + printf(" mov rax, 0\n"); + } codegen_func_epilogue(g, ast); printf("\n"); diff --git a/main.c b/main.c index e9a4fa0..34a847f 100644 --- a/main.c +++ b/main.c @@ -26,5 +26,4 @@ int main(int argc, char** argv) { Program* prog = parse(tokens); analyze(prog); codegen(prog); - return 0; } diff --git a/tests/064.sh b/tests/064.sh new file mode 100644 index 0000000..80fba4f --- /dev/null +++ b/tests/064.sh @@ -0,0 +1,22 @@ +set -e + +# C99: 5.1.2.2.3 +bash ../../test_exit_code.sh 0 <<'EOF' +int main() { +} +EOF + +bash ../../test_exit_code.sh 0 <<'EOF' +int main() { + 1 + 2 + 3; +} +EOF + +bash ../../test_exit_code.sh 0 <<'EOF' +int main() { + if (1) { + } else { + return 1; + } +} +EOF -- cgit v1.2.3-70-g09d2