From 0b77ae0eda8d3abca659f816040021a82a456e81 Mon Sep 17 00:00:00 2001 From: lemon Date: Sun, 23 Nov 2025 19:38:38 +0100 Subject: c: check actual reachability for non-void func may not return value --- c/c.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'c/c.c') diff --git a/c/c.c b/c/c.c index c2c0537..d609cd0 100644 --- a/c/c.c +++ b/c/c.c @@ -4201,11 +4201,15 @@ function(struct comp *cm, struct function *fn, const char **pnames, const struct } if (fn->curblk) { if (!strcmp(fn->name, "main") && fn->retty.t == TYINT) { - /* implicit return 0 for main function */ + /* implicit return 0 for main function (ISO C standard behavior) */ putreturn(fn, ZEROREF, NOREF); } else { if (fn->retty.t != TYVOID && !nerror) { - warn(&cm->fnblkspan, "non-void function may not return a value"); + /* it may not actually be reachable after constant-folding + * peephole optimizations (from code like assert(0 && "x")) */ + if (blkreachable(fn, fn->curblk)) { + warn(&cm->fnblkspan, "non-void function may not return a value"); + } } putreturn(fn, NOREF, NOREF); } -- cgit v1.2.3