Module Name: src
Committed By: rillig
Date: Sun Oct 18 21:12:13 UTC 2020
Modified Files:
src/usr.bin/make/unit-tests: varmod-loop.mk
Log Message:
make(1): add test for nested :@ modifiers using the same variable name
To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/usr.bin/make/unit-tests/varmod-loop.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/varmod-loop.mk
diff -u src/usr.bin/make/unit-tests/varmod-loop.mk:1.3 src/usr.bin/make/unit-tests/varmod-loop.mk:1.4
--- src/usr.bin/make/unit-tests/varmod-loop.mk:1.3 Sun Sep 13 07:32:32 2020
+++ src/usr.bin/make/unit-tests/varmod-loop.mk Sun Oct 18 21:12:13 2020
@@ -1,4 +1,4 @@
-# $NetBSD: varmod-loop.mk,v 1.3 2020/09/13 07:32:32 rillig Exp $
+# $NetBSD: varmod-loop.mk,v 1.4 2020/10/18 21:12:13 rillig Exp $
#
# Tests for the :@var@...${var}...@ variable modifier.
@@ -66,3 +66,18 @@ mod-loop-dollar:
@echo $@:${:U4:@word@$$$${word}$$$$@:Q}:
@echo $@:${:U5:@word@$$$$${word}$$$$$@:Q}:
@echo $@:${:U6:@word@$$$$$${word}$$$$$$@:Q}:
+
+# It may happen that there are nested :@ modifiers that use the same name for
+# for the loop variable. These modifiers influence each other.
+#
+# As of 2020-10-18, the :@ modifier is implemented by actually setting an
+# variable in the context of the expression and deleting it again after the
+# loop. This is different from the .for loops, which substitute the variable
+# expression with ${:Uvalue}, leading to different unwanted side effects.
+#
+# To make the behavior more predictable, the :@ modifier should restore the
+# loop variable to the value it had before the loop. This would result in
+# the string "1a b c1 2a b c2 3a b c3", making the two loops independent.
+.if ${:U1 2 3:@i@$i${:Ua b c:@i@$i@}${i:Uu}@} != "1a b cu 2a b cu 3a b cu"
+. error
+.endif