aboutsummaryrefslogtreecommitdiffhomepage
path: root/c
diff options
context:
space:
mode:
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);
}