Module Name: src Committed By: rillig Date: Sat Apr 15 10:32:46 UTC 2023
Modified Files: src/usr.bin/xlint/lint1: func.c Log Message: lint: extract checking the return value to separate function No functional change. To generate a diff of this commit: cvs rdiff -u -r1.151 -r1.152 src/usr.bin/xlint/lint1/func.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.bin/xlint/lint1/func.c diff -u src/usr.bin/xlint/lint1/func.c:1.151 src/usr.bin/xlint/lint1/func.c:1.152 --- src/usr.bin/xlint/lint1/func.c:1.151 Tue Mar 28 20:01:21 2023 +++ src/usr.bin/xlint/lint1/func.c Sat Apr 15 10:32:46 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: func.c,v 1.151 2023/03/28 20:01:21 rillig Exp $ */ +/* $NetBSD: func.c,v 1.152 2023/04/15 10:32:46 rillig Exp $ */ /* * Copyright (c) 1994, 1995 Jochen Pohl @@ -37,7 +37,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) -__RCSID("$NetBSD: func.c,v 1.151 2023/03/28 20:01:21 rillig Exp $"); +__RCSID("$NetBSD: func.c,v 1.152 2023/04/15 10:32:46 rillig Exp $"); #endif #include <stdlib.h> @@ -1047,6 +1047,32 @@ do_continue(void) set_reached(false); } +static void +check_return_value(bool sys, tnode_t *tn) +{ + /* Create a temporary node for the left side */ + tnode_t *ln = expr_zero_alloc(sizeof(*ln)); + ln->tn_op = NAME; + ln->tn_type = expr_unqualified_type(funcsym->s_type->t_subt); + ln->tn_lvalue = true; + ln->tn_sym = funcsym; /* better than nothing */ + + tnode_t *retn = build_binary(ln, RETURN, sys, tn); + + if (retn != NULL) { + const tnode_t *rn = retn->tn_right; + while (rn->tn_op == CVT || rn->tn_op == PLUS) + rn = rn->tn_left; + if (rn->tn_op == ADDR && rn->tn_left->tn_op == NAME && + rn->tn_left->tn_sym->s_scl == AUTO) { + /* '%s' returns pointer to automatic object */ + warning(302, funcsym->s_name); + } + } + + expr(retn, true, false, true, false); +} + /* * T_RETURN T_SEMI * T_RETURN expr T_SEMI @@ -1054,11 +1080,8 @@ do_continue(void) void do_return(bool sys, tnode_t *tn) { - tnode_t *ln, *rn; - control_statement *cs; - op_t op; + control_statement *cs = cstmt; - cs = cstmt; if (cs == NULL) { /* syntax error '%s' */ error(249, "return outside function"); @@ -1088,36 +1111,11 @@ do_return(bool sys, tnode_t *tn) warning(214, funcsym->s_name); } - if (tn != NULL) { - - /* Create a temporary node for the left side */ - ln = expr_zero_alloc(sizeof(*ln)); - ln->tn_op = NAME; - ln->tn_type = expr_unqualified_type(funcsym->s_type->t_subt); - ln->tn_lvalue = true; - ln->tn_sym = funcsym; /* better than nothing */ - - tn = build_binary(ln, RETURN, sys, tn); - - if (tn != NULL) { - rn = tn->tn_right; - while ((op = rn->tn_op) == CVT || op == PLUS) - rn = rn->tn_left; - if (rn->tn_op == ADDR && rn->tn_left->tn_op == NAME && - rn->tn_left->tn_sym->s_scl == AUTO) { - /* '%s' returns pointer to automatic object */ - warning(302, funcsym->s_name); - } - } - - expr(tn, true, false, true, false); - - } else { - + if (tn != NULL) + check_return_value(sys, tn); + else check_statement_reachable(); - } - set_reached(false); }