Module Name:    src
Committed By:   rillig
Date:           Tue Aug 23 21:13:47 UTC 2022

Modified Files:
        src/usr.bin/make/unit-tests: varmod-loop.exp varmod-loop.mk

Log Message:
tests/make: document how the modifier ':@' works


To generate a diff of this commit:
cvs rdiff -u -r1.17 -r1.18 src/usr.bin/make/unit-tests/varmod-loop.exp
cvs rdiff -u -r1.20 -r1.21 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.exp
diff -u src/usr.bin/make/unit-tests/varmod-loop.exp:1.17 src/usr.bin/make/unit-tests/varmod-loop.exp:1.18
--- src/usr.bin/make/unit-tests/varmod-loop.exp:1.17	Tue Aug 23 19:22:01 2022
+++ src/usr.bin/make/unit-tests/varmod-loop.exp	Tue Aug 23 21:13:46 2022
@@ -14,4 +14,9 @@ mod-loop-dollar:$${word}$$:
 mod-loop-dollar:$$5$$:
 mod-loop-dollar:$$${word}$$$:
 :  t=$(( ${t:-0} + 1 ))
+:  dollar=end
+:  backslash=\ end
+:  dollar=$ at=@ backslash=\ end
+:  dollar=$$ at=@@ backslash=\\ end
+:  dollar=$$ at=@@ backslash=\\ end
 exit status 0

Index: src/usr.bin/make/unit-tests/varmod-loop.mk
diff -u src/usr.bin/make/unit-tests/varmod-loop.mk:1.20 src/usr.bin/make/unit-tests/varmod-loop.mk:1.21
--- src/usr.bin/make/unit-tests/varmod-loop.mk:1.20	Tue Aug 23 19:22:01 2022
+++ src/usr.bin/make/unit-tests/varmod-loop.mk	Tue Aug 23 21:13:46 2022
@@ -1,4 +1,4 @@
-# $NetBSD: varmod-loop.mk,v 1.20 2022/08/23 19:22:01 rillig Exp $
+# $NetBSD: varmod-loop.mk,v 1.21 2022/08/23 21:13:46 rillig Exp $
 #
 # Tests for the :@var@...${var}...@ variable modifier.
 
@@ -199,4 +199,36 @@ varmod-loop-literal-dollar: .PHONY
 	: ${:U1:@i@ t=$$(( $${t:-0} + $i ))@}
 
 
+# When parsing the loop body, each '\$', '\@' and '\\' is unescaped to '$',
+# '@' and '\'; all other backslashes are retained.
+#
+# In practice, the '$' is not escaped as '\$', as there is a second round of
+# unescaping '$$' to '$' later when the loop body is expanded after setting the
+# iteration variable.
+#
+# After the iteration variable has been set, the loop body is expanded with
+# this unescaping, regardless of whether .MAKE.SAVE_DOLLARS is set or not:
+#	$$			a literal '$'
+#	$x, ${var}, $(var)	a nested expression
+#	any other character	itself
+all: escape-modifier
+escape-modifier: .PHONY
+	# In the first round, '\$ ' is unescaped to '$ ', and since the
+	# variable named ' ' is not defined, the expression '$ ' expands to an
+	# empty string.
+	# expect: :  dollar=end
+	: ${:U1:@i@ dollar=\$ end@}
+
+	# Like in other modifiers, '\ ' is preserved, since ' ' is not one of
+	# the characters that _must_ be escaped.
+	# expect: :  backslash=\ end
+	: ${:U1:@i@ backslash=\ end@}
+
+	# expect: :  dollar=$ at=@ backslash=\ end
+	: ${:U1:@i@ dollar=\$\$ at=\@ backslash=\\ end@}
+	# expect: :  dollar=$$ at=@@ backslash=\\ end
+	: ${:U1:@i@ dollar=\$\$\$\$ at=\@\@ backslash=\\\\ end@}
+	# expect: :  dollar=$$ at=@@ backslash=\\ end
+	: ${:U1:@i@ dollar=$$$$ at=\@\@ backslash=\\\\ end@}
+
 all: .PHONY

Reply via email to