diff options
| author | 2025-11-23 19:38:38 +0100 | |
|---|---|---|
| committer | 2025-11-23 19:38:38 +0100 | |
| commit | 0b77ae0eda8d3abca659f816040021a82a456e81 (patch) | |
| tree | de72d56c0d0f3efb88faba88129d7825973bace8 /c/c.c | |
| parent | a86bbfc553433e377e48f9e26c90bcc5b4fe0263 (diff) | |
c: check actual reachability for non-void func may not return value
Diffstat (limited to 'c/c.c')
| -rw-r--r-- | c/c.c | 8 |
1 files changed, 6 insertions, 2 deletions
@@ -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); } |