Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/usr.bin/make make(1): in lint mode, report undefined variabl...



details:   https://anonhg.NetBSD.org/src/rev/6dfa0f03c795
branches:  trunk
changeset: 976161:6dfa0f03c795
user:      rillig <rillig%NetBSD.org@localhost>
date:      Sun Sep 13 20:21:24 2020 +0000

description:
make(1): in lint mode, report undefined variables in conditions

diffstat:

 usr.bin/make/unit-tests/opt-debug-lint.exp |   1 +
 usr.bin/make/unit-tests/opt-debug-lint.mk  |  11 ++++++++++-
 usr.bin/make/var.c                         |  24 +++++++++++++++++++-----
 3 files changed, 30 insertions(+), 6 deletions(-)

diffs (80 lines):

diff -r a5c49bc0cf30 -r 6dfa0f03c795 usr.bin/make/unit-tests/opt-debug-lint.exp
--- a/usr.bin/make/unit-tests/opt-debug-lint.exp        Sun Sep 13 20:04:26 2020 +0000
+++ b/usr.bin/make/unit-tests/opt-debug-lint.exp        Sun Sep 13 20:21:24 2020 +0000
@@ -1,4 +1,5 @@
 make: "opt-debug-lint.mk" line 18: Variable "X" is undefined
+make: "opt-debug-lint.mk" line 40: Variable "UNDEF" is undefined
 make: Fatal errors encountered -- cannot continue
 make: stopped in unit-tests
 exit status 1
diff -r a5c49bc0cf30 -r 6dfa0f03c795 usr.bin/make/unit-tests/opt-debug-lint.mk
--- a/usr.bin/make/unit-tests/opt-debug-lint.mk Sun Sep 13 20:04:26 2020 +0000
+++ b/usr.bin/make/unit-tests/opt-debug-lint.mk Sun Sep 13 20:21:24 2020 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: opt-debug-lint.mk,v 1.2 2020/09/13 19:28:46 rillig Exp $
+# $NetBSD: opt-debug-lint.mk,v 1.3 2020/09/13 20:21:24 rillig Exp $
 #
 # Tests for the -dL command line option, which runs additional checks
 # to catch common mistakes, such as unclosed variable expressions.
@@ -32,5 +32,14 @@
 .  error
 .endif
 
+# Since 2020-09-13, Var_Parse properly reports errors for undefined variables,
+# but only in lint mode.  Before, it had only silently returned var_Error,
+# hoping for the caller to print an error message.  This resulted in the
+# well-known "Malformed conditional" error message, even though the
+# conditional was well-formed and the only error was an undefined variable.
+.if ${UNDEF}
+.  error
+.endif
+
 all:
        @:;
diff -r a5c49bc0cf30 -r 6dfa0f03c795 usr.bin/make/var.c
--- a/usr.bin/make/var.c        Sun Sep 13 20:04:26 2020 +0000
+++ b/usr.bin/make/var.c        Sun Sep 13 20:21:24 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: var.c,v 1.517 2020/09/13 19:46:23 rillig Exp $ */
+/*     $NetBSD: var.c,v 1.518 2020/09/13 20:21:24 rillig Exp $ */
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -121,7 +121,7 @@
 #include    "metachar.h"
 
 /*     "@(#)var.c      8.3 (Berkeley) 3/19/94" */
-MAKE_RCSID("$NetBSD: var.c,v 1.517 2020/09/13 19:46:23 rillig Exp $");
+MAKE_RCSID("$NetBSD: var.c,v 1.518 2020/09/13 20:21:24 rillig Exp $");
 
 #define VAR_DEBUG_IF(cond, fmt, ...)   \
     if (!(DEBUG(VAR) && (cond)))       \
@@ -3560,11 +3560,25 @@
                    free(varname);
                    *out_val = pstr;
                    return VPE_OK;
-               } else {
+               }
+
+               if ((eflags & VARE_UNDEFERR) && DEBUG(LINT)) {
+                   Parse_Error(PARSE_FATAL, "Variable \"%s\" is undefined",
+                               varname);
                    free(varname);
-                   *out_val = eflags & VARE_UNDEFERR ? var_Error : varNoError;
-                   return eflags & VARE_UNDEFERR ? VPE_UNDEF_SILENT : VPE_OK;
+                   *out_val = var_Error;
+                   return VPE_UNDEF_MSG;
                }
+
+               if (eflags & VARE_UNDEFERR) {
+                   free(varname);
+                   *out_val = var_Error;
+                   return VPE_UNDEF_SILENT;
+               }
+
+               free(varname);
+               *out_val = varNoError;
+               return VPE_OK;
            }
 
            /* The variable expression is based on an undefined variable.



Home | Main Index | Thread Index | Old Index