Module Name:    src
Committed By:   rillig
Date:           Sat Nov 28 14:08:38 UTC 2020

Modified Files:
        src/usr.bin/make/unit-tests: cond-func-empty.mk varmisc.mk

Log Message:
make(1): move test for recursive variable to cond-func-empty

Previously, the documentation of that test was much too short to explain
all the effects that happened in the bug situation from 2020-06-28 until
2020-07-02.


To generate a diff of this commit:
cvs rdiff -u -r1.10 -r1.11 src/usr.bin/make/unit-tests/cond-func-empty.mk
cvs rdiff -u -r1.28 -r1.29 src/usr.bin/make/unit-tests/varmisc.mk

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/make/unit-tests/cond-func-empty.mk
diff -u src/usr.bin/make/unit-tests/cond-func-empty.mk:1.10 src/usr.bin/make/unit-tests/cond-func-empty.mk:1.11
--- src/usr.bin/make/unit-tests/cond-func-empty.mk:1.10	Sun Nov 15 14:07:53 2020
+++ src/usr.bin/make/unit-tests/cond-func-empty.mk	Sat Nov 28 14:08:37 2020
@@ -1,4 +1,4 @@
-# $NetBSD: cond-func-empty.mk,v 1.10 2020/11/15 14:07:53 rillig Exp $
+# $NetBSD: cond-func-empty.mk,v 1.11 2020/11/28 14:08:37 rillig Exp $
 #
 # Tests for the empty() function in .if conditions, which tests a variable
 # expression for emptiness.
@@ -155,5 +155,30 @@ ${:U WORD }=	variable name with spaces
 .  error
 .endif
 
+# Between 2020-06-28 and var.c 1.226 from 2020-07-02, this paragraph generated
+# a wrong error message "Variable VARNAME is recursive".
+#
+# The bug was that the !empty() condition was evaluated, even though this was
+# not necessary since the defined() condition already evaluated to false.
+#
+# When evaluating the !empty condition, the variable name was parsed as
+# "VARNAME${:U2}", but without expanding any nested variable expression, in
+# this case the ${:U2}.  Therefore, the variable name came out as simply
+# "VARNAME".  Since this variable name should have been discarded quickly after
+# parsing it, this unrealistic variable name should have done no harm.
+#
+# The variable expression was expanded though, and this was wrong.  The
+# expansion was done without the VARE_WANTRES flag (called VARF_WANTRES back
+# then) though.  This had the effect that the ${:U1} from the value of VARNAME
+# expanded to an empty string.  This in turn created the seemingly recursive
+# definition VARNAME=${VARNAME}, and that definition was never meant to be
+# expanded.
+#
+# This was fixed by expanding nested variable expressions in the variable name
+# only if the flag VARE_WANTRES is given.
+VARNAME=	${VARNAME${:U1}}
+.if defined(VARNAME${:U2}) && !empty(VARNAME${:U2})
+.endif
+
 all:
 	@:;

Index: src/usr.bin/make/unit-tests/varmisc.mk
diff -u src/usr.bin/make/unit-tests/varmisc.mk:1.28 src/usr.bin/make/unit-tests/varmisc.mk:1.29
--- src/usr.bin/make/unit-tests/varmisc.mk:1.28	Sat Nov  7 00:07:02 2020
+++ src/usr.bin/make/unit-tests/varmisc.mk	Sat Nov 28 14:08:37 2020
@@ -1,4 +1,4 @@
-# $NetBSD: varmisc.mk,v 1.28 2020/11/07 00:07:02 rillig Exp $
+# $NetBSD: varmisc.mk,v 1.29 2020/11/28 14:08:37 rillig Exp $
 #
 # Miscellaneous variable tests.
 
@@ -77,16 +77,6 @@ MAN+=	${MAN$s}
 manok:
 	@echo MAN=${MAN}
 
-# This is an expanded variant of the above .for loop.
-# Between 2020-06-28 and 2020-07-02 this paragraph generated a wrong
-# error message "Variable VARNAME is recursive".
-# When evaluating the !empty expression, the ${:U1} was not expanded and
-# thus resulted in the seeming definition VARNAME=${VARNAME}, which is
-# obviously recursive.
-VARNAME=	${VARNAME${:U1}}
-.if defined(VARNAME${:U2}) && !empty(VARNAME${:U2})
-.endif
-
 # begin .MAKE.SAVE_DOLLARS; see Var_SetWithFlags and ParseBoolean.
 SD_VALUES=	0 1 2 False True false true Yes No yes no On Off ON OFF on off
 SD_4_DOLLARS=	$$$$

Reply via email to