Module Name: src
Committed By: rillig
Date: Sun Nov 8 13:46:16 UTC 2020
Modified Files:
src/usr.bin/make/unit-tests: var-op-expand.exp var-op-expand.mk
Log Message:
make(1): add test for edge case in resolving undefined variables
To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/usr.bin/make/unit-tests/var-op-expand.exp
cvs rdiff -u -r1.2 -r1.3 src/usr.bin/make/unit-tests/var-op-expand.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/var-op-expand.exp
diff -u src/usr.bin/make/unit-tests/var-op-expand.exp:1.1 src/usr.bin/make/unit-tests/var-op-expand.exp:1.2
--- src/usr.bin/make/unit-tests/var-op-expand.exp:1.1 Sun Aug 16 12:07:51 2020
+++ src/usr.bin/make/unit-tests/var-op-expand.exp Sun Nov 8 13:46:15 2020
@@ -1 +1,10 @@
+Var_Parse: ${UNDEF} with VARE_WANTRES
+Global:VAR_ASSIGN_ = undef value
+Var_Parse: ${UNDEF} with VARE_WANTRES
+Var_Parse: ${UNDEF} with VARE_WANTRES
+Global:VAR_SUBST_${UNDEF} =
+Var_Parse: ${UNDEF} with VARE_WANTRES
+Global:VAR_SUBST_ = undef value
+Global:.MAKEFLAGS = -r -k -d v -d
+Global:.MAKEFLAGS = -r -k -d v -d 0
exit status 0
Index: src/usr.bin/make/unit-tests/var-op-expand.mk
diff -u src/usr.bin/make/unit-tests/var-op-expand.mk:1.2 src/usr.bin/make/unit-tests/var-op-expand.mk:1.3
--- src/usr.bin/make/unit-tests/var-op-expand.mk:1.2 Sun Aug 16 14:25:16 2020
+++ src/usr.bin/make/unit-tests/var-op-expand.mk Sun Nov 8 13:46:15 2020
@@ -1,9 +1,27 @@
-# $NetBSD: var-op-expand.mk,v 1.2 2020/08/16 14:25:16 rillig Exp $
+# $NetBSD: var-op-expand.mk,v 1.3 2020/11/08 13:46:15 rillig Exp $
#
# Tests for the := variable assignment operator, which expands its
# right-hand side.
# TODO: Implementation
+# XXX: edge case: When a variable name refers to an undefined variable, the
+# behavior differs between the '=' and the ':=' assignment operators.
+# This bug exists since at least 1993-03-21.
+#
+# The '=' operator expands the undefined variable to an empty string, thus
+# assigning to VAR_ASSIGN_. In the name of variables to be set, it should
+# really be forbidden to refer to undefined variables.
+#
+# The ':=' operator expands the variable name twice. In one of these
+# expansions, the undefined variable expression is preserved (controlled by
+# preserveUndefined in VarAssign_EvalSubst), in the other expansion it expands
+# to an empty string. This way, 2 variables are created using a single
+# variable assignment. It's magic. :-/
+.MAKEFLAGS: -dv
+VAR_ASSIGN_${UNDEF}= undef value
+VAR_SUBST_${UNDEF}:= undef value
+.MAKEFLAGS: -d0
+
all:
@:;