aboutsummaryrefslogtreecommitdiffhomepage
path: root/c
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2025-11-23 19:38:38 +0100
committerlemon <lsof@mailbox.org>2025-11-23 19:38:38 +0100
commit0b77ae0eda8d3abca659f816040021a82a456e81 (patch)
treede72d56c0d0f3efb88faba88129d7825973bace8 /c
parenta86bbfc553433e377e48f9e26c90bcc5b4fe0263 (diff)
c: check actual reachability for non-void func may not return value
Diffstat (limited to 'c')
-rw-r--r--c/c.c8
1 files changed, 6 insertions, 2 deletions
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);
}