From f4efb7811b741d006e33838219b7f3857655a71b Mon Sep 17 00:00:00 2001 From: zinc Date: Wed, 14 Oct 2026 15:56:18 +0330 Subject: return: a value returned from a void function is dropped and the function yields 0 (typecheck off, spec 4.8.3) --- src/compiler/stmt.zc | 2 +- tests/conformance/known.txt | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/compiler/stmt.zc b/src/compiler/stmt.zc index 21d5801..d84f08f 100644 --- a/src/compiler/stmt.zc +++ b/src/compiler/stmt.zc @@ -649,7 +649,7 @@ int kw_return() { } if_ret(xty, xzero); if (fty && fty != tvoid) fcoerce(fty); - if (fty == tvoid) tcerr("return value", tvoid, xty); + if (fty == tvoid) { tcerr("return value", tvoid, xty); op(O_DROP); lit(0); } // typecheck off: the value is ignored (spec 4.8.3) else if (fty && !compat(fty, xty)) tcerr("return value", fty, xty); } if (nclo) { diff --git a/tests/conformance/known.txt b/tests/conformance/known.txt index e535b0a..1adcdf4 100644 --- a/tests/conformance/known.txt +++ b/tests/conformance/known.txt @@ -1,6 +1,5 @@ # understood conformance failures: PATH IMPL CLASS reason # class a: self-hosted compiler bug; b: zc0 deviation (appendix a/b); c: spec issue to settle -2-types/typecheck_off_void_return_value_ok.zc zy a void f() { return 3; } yields 3, not 0 (spec 4.8.3) 4-statements/memdebug_scrub_accepted.zc zy a memdebug scrub; is rejected (appendix b.1.1, b.2.1) 4-statements/memdebug_scrub_fills.zc zy a memdebug scrub; is rejected (appendix b.1.1, b.2.1) 4-statements/o3_outside_function_ordinary_block.zc zy c top-level o3 { } is rejected; spec 4.10.2 says it is an ordinary block -- cgit v1.2.3