Module Name: src
Committed By: rillig
Date: Sat Jul 6 10:14:35 UTC 2024
Modified Files:
src/usr.bin/make/unit-tests: deptgt.exp deptgt.mk
directive-for-errors.exp directive-for-errors.mk
directive-for-escape.exp directive-for-escape.mk directive-for.exp
directive-for.mk varmod-edge.exp varmod-edge.mk
Log Message:
tests/make: clean up tests
Prefer "expect+X" directives to be above the code generating them,
instead of "expect-X" directives below the code.
In varmod-edge.mk, separate the tests, as the common loop does not pull
its weight.
To generate a diff of this commit:
cvs rdiff -u -r1.16 -r1.17 src/usr.bin/make/unit-tests/deptgt.exp
cvs rdiff -u -r1.19 -r1.20 src/usr.bin/make/unit-tests/deptgt.mk
cvs rdiff -u -r1.7 -r1.8 src/usr.bin/make/unit-tests/directive-for-errors.exp
cvs rdiff -u -r1.12 -r1.13 \
src/usr.bin/make/unit-tests/directive-for-errors.mk
cvs rdiff -u -r1.28 -r1.29 \
src/usr.bin/make/unit-tests/directive-for-escape.exp
cvs rdiff -u -r1.26 -r1.27 \
src/usr.bin/make/unit-tests/directive-for-escape.mk \
src/usr.bin/make/unit-tests/directive-for.mk
cvs rdiff -u -r1.24 -r1.25 src/usr.bin/make/unit-tests/directive-for.exp
cvs rdiff -u -r1.23 -r1.24 src/usr.bin/make/unit-tests/varmod-edge.exp
cvs rdiff -u -r1.25 -r1.26 src/usr.bin/make/unit-tests/varmod-edge.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/deptgt.exp
diff -u src/usr.bin/make/unit-tests/deptgt.exp:1.16 src/usr.bin/make/unit-tests/deptgt.exp:1.17
--- src/usr.bin/make/unit-tests/deptgt.exp:1.16 Fri Jul 5 20:01:52 2024
+++ src/usr.bin/make/unit-tests/deptgt.exp Sat Jul 6 10:14:35 2024
@@ -8,6 +8,7 @@ ParseDependency(: empty-source)
Parsing line 39: : command for empty targets list
Parsing line 40: .MAKEFLAGS: -d0
ParseDependency(.MAKEFLAGS: -d0)
+make: "deptgt.mk" line 45: while evaluating "${:U:Z}:" with value "": Unknown modifier "Z"
make: "deptgt.mk" line 49: while parsing "${:U:Z}:": Unknown modifier "Z"
make: "deptgt.mk" line 52: warning: Extra target 'ordinary' ignored
make: "deptgt.mk" line 55: warning: Extra target (ordinary) ignored
Index: src/usr.bin/make/unit-tests/deptgt.mk
diff -u src/usr.bin/make/unit-tests/deptgt.mk:1.19 src/usr.bin/make/unit-tests/deptgt.mk:1.20
--- src/usr.bin/make/unit-tests/deptgt.mk:1.19 Fri Jul 5 20:01:52 2024
+++ src/usr.bin/make/unit-tests/deptgt.mk Sat Jul 6 10:14:35 2024
@@ -1,4 +1,4 @@
-# $NetBSD: deptgt.mk,v 1.19 2024/07/05 20:01:52 rillig Exp $
+# $NetBSD: deptgt.mk,v 1.20 2024/07/06 10:14:35 rillig Exp $
#
# Tests for special targets like .BEGIN or .SUFFIXES in dependency
# declarations.
@@ -39,14 +39,14 @@ ${:U}: empty-source
: command for empty targets list
.MAKEFLAGS: -d0
-# Just to show that a malformed expression is only expanded once in
-# ParseDependencyTargetWord. The only way to produce an expression that
-# is well-formed on the first expansion and ill-formed on the second
-# expansion would be to use the variable modifier '::=' to modify the
-# targets. This in turn would be such an extreme and unreliable edge case
-# that nobody uses it.
+# In a dependency declaration, the whole line is expanded before interpreting
+# the line.
+# expect+1: while evaluating "${:U:Z}:" with value "": Unknown modifier "Z"
+${:U:Z}:
+# After expanding the line as a whole, each target is parsed but not
+# evaluated, separately, in ParseDependencyTargetWord.
# expect+1: while parsing "${:U:Z}:": Unknown modifier "Z"
-$$$$$$$${:U:Z}:
+$${:U:Z}:
# expect+1: warning: Extra target 'ordinary' ignored
.END ordinary:
@@ -56,6 +56,3 @@ $$$$$$$${:U:Z}:
# expect+1: warning: Special and mundane targets don't mix. Mundane ones ignored
ordinary .PATH:
-
-all:
- @:;
Index: src/usr.bin/make/unit-tests/directive-for-errors.exp
diff -u src/usr.bin/make/unit-tests/directive-for-errors.exp:1.7 src/usr.bin/make/unit-tests/directive-for-errors.exp:1.8
--- src/usr.bin/make/unit-tests/directive-for-errors.exp:1.7 Fri Jul 5 19:47:22 2024
+++ src/usr.bin/make/unit-tests/directive-for-errors.exp Sat Jul 6 10:14:35 2024
@@ -1,17 +1,17 @@
make: "directive-for-errors.mk" line 9: Unknown directive "fori"
-make: "directive-for-errors.mk" line 10: warning: <>
-make: "directive-for-errors.mk" line 11: for-less endfor
+make: "directive-for-errors.mk" line 11: warning: <>
+make: "directive-for-errors.mk" line 13: for-less endfor
make: "directive-for-errors.mk" line 25: Unknown directive "for"
-make: "directive-for-errors.mk" line 26: warning: <>
-make: "directive-for-errors.mk" line 27: for-less endfor
+make: "directive-for-errors.mk" line 27: warning: <>
+make: "directive-for-errors.mk" line 29: for-less endfor
make: "directive-for-errors.mk" line 44: invalid character '$' in .for loop variable name
make: "directive-for-errors.mk" line 52: no iteration variables in for
make: "directive-for-errors.mk" line 64: Wrong number of words (5) in .for substitution list with 3 variables
make: "directive-for-errors.mk" line 78: missing `in' in for
make: "directive-for-errors.mk" line 89: while evaluating "${:U3:Z} 4" with value "3": Unknown modifier "Z"
-make: "directive-for-errors.mk" line 90: warning: Should not be reached.
-make: "directive-for-errors.mk" line 90: warning: Should not be reached.
-make: "directive-for-errors.mk" line 90: warning: Should not be reached.
+make: "directive-for-errors.mk" line 93: warning: Should not be reached.
+make: "directive-for-errors.mk" line 93: warning: Should not be reached.
+make: "directive-for-errors.mk" line 93: warning: Should not be reached.
make: Fatal errors encountered -- cannot continue
make: stopped in unit-tests
exit status 1
Index: src/usr.bin/make/unit-tests/directive-for-errors.mk
diff -u src/usr.bin/make/unit-tests/directive-for-errors.mk:1.12 src/usr.bin/make/unit-tests/directive-for-errors.mk:1.13
--- src/usr.bin/make/unit-tests/directive-for-errors.mk:1.12 Fri Jul 5 19:47:22 2024
+++ src/usr.bin/make/unit-tests/directive-for-errors.mk Sat Jul 6 10:14:35 2024
@@ -1,4 +1,4 @@
-# $NetBSD: directive-for-errors.mk,v 1.12 2024/07/05 19:47:22 rillig Exp $
+# $NetBSD: directive-for-errors.mk,v 1.13 2024/07/06 10:14:35 rillig Exp $
#
# Tests for error handling in .for loops.
@@ -7,10 +7,10 @@
# in a parse error.
# expect+1: Unknown directive "fori"
.fori in 1 2 3
+# expect+1: warning: <>
. warning <${i}>
+# expect+1: for-less endfor
.endfor
-# expect-2: warning: <>
-# expect-2: for-less endfor
# A slash is not whitespace, therefore this is not parsed as a .for loop.
@@ -23,10 +23,10 @@
# name is parsed a bit differently.
# expect+1: Unknown directive "for"
.for/i in 1 2 3
+# expect+1: warning: <>
. warning <${i}>
+# expect+1: for-less endfor
.endfor
-# expect-2: warning: <>
-# expect-2: for-less endfor
# Before for.c 1.173 from 2023-05-08, the variable name could be an arbitrary
@@ -87,8 +87,8 @@ ${:U\\}= backslash # see whether the "va
# the loop body is expanded as if no error had happened.
# expect+1: while evaluating "${:U3:Z} 4" with value "3": Unknown modifier "Z"
.for i in 1 2 ${:U3:Z} 4
+# expect+3: warning: Should not be reached.
+# expect+2: warning: Should not be reached.
+# expect+1: warning: Should not be reached.
. warning Should not be reached.
.endfor
-# expect-2: warning: Should not be reached.
-# expect-3: warning: Should not be reached.
-# expect-4: warning: Should not be reached.
Index: src/usr.bin/make/unit-tests/directive-for-escape.exp
diff -u src/usr.bin/make/unit-tests/directive-for-escape.exp:1.28 src/usr.bin/make/unit-tests/directive-for-escape.exp:1.29
--- src/usr.bin/make/unit-tests/directive-for-escape.exp:1.28 Fri Jul 5 19:47:22 2024
+++ src/usr.bin/make/unit-tests/directive-for-escape.exp Sat Jul 6 10:14:35 2024
@@ -16,36 +16,121 @@ make: "directive-for-escape.mk" line 33:
make: "directive-for-escape.mk" line 33: !"\\
For: end for 1
For: loop body with i = $:
+# expect: . info ${:U\$}
+# expect+9: $
+# expect: . info ${:U${V}}
+# expect+7: value
+# expect: . info ${:U${V:=-with-modifier}}
+# expect+5: value-with-modifier
+# expect: . info ${:U$(V)}
+# expect+3: value
+# expect: . info ${:U$(V:=-with-modifier)}
+# expect+1: value-with-modifier
. info ${:U\$}
-make: "directive-for-escape.mk" line 47: $
+make: "directive-for-escape.mk" line 57: $
For: loop body with i = ${V}:
+# expect: . info ${:U\$}
+# expect+9: $
+# expect: . info ${:U${V}}
+# expect+7: value
+# expect: . info ${:U${V:=-with-modifier}}
+# expect+5: value-with-modifier
+# expect: . info ${:U$(V)}
+# expect+3: value
+# expect: . info ${:U$(V:=-with-modifier)}
+# expect+1: value-with-modifier
. info ${:U${V}}
-make: "directive-for-escape.mk" line 47: value
+make: "directive-for-escape.mk" line 57: value
For: loop body with i = ${V:=-with-modifier}:
+# expect: . info ${:U\$}
+# expect+9: $
+# expect: . info ${:U${V}}
+# expect+7: value
+# expect: . info ${:U${V:=-with-modifier}}
+# expect+5: value-with-modifier
+# expect: . info ${:U$(V)}
+# expect+3: value
+# expect: . info ${:U$(V:=-with-modifier)}
+# expect+1: value-with-modifier
. info ${:U${V:=-with-modifier}}
-make: "directive-for-escape.mk" line 47: value-with-modifier
+make: "directive-for-escape.mk" line 57: value-with-modifier
For: loop body with i = $(V):
+# expect: . info ${:U\$}
+# expect+9: $
+# expect: . info ${:U${V}}
+# expect+7: value
+# expect: . info ${:U${V:=-with-modifier}}
+# expect+5: value-with-modifier
+# expect: . info ${:U$(V)}
+# expect+3: value
+# expect: . info ${:U$(V:=-with-modifier)}
+# expect+1: value-with-modifier
. info ${:U$(V)}
-make: "directive-for-escape.mk" line 47: value
+make: "directive-for-escape.mk" line 57: value
For: loop body with i = $(V:=-with-modifier):
+# expect: . info ${:U\$}
+# expect+9: $
+# expect: . info ${:U${V}}
+# expect+7: value
+# expect: . info ${:U${V:=-with-modifier}}
+# expect+5: value-with-modifier
+# expect: . info ${:U$(V)}
+# expect+3: value
+# expect: . info ${:U$(V:=-with-modifier)}
+# expect+1: value-with-modifier
. info ${:U$(V:=-with-modifier)}
-make: "directive-for-escape.mk" line 47: value-with-modifier
+make: "directive-for-escape.mk" line 57: value-with-modifier
For: end for 1
For: loop body with i = $:
+# expect: . info ${:U\$}
+# expect+6: $
+# expect: . info ${:U${V}}
+# expect+4: value
+# expect+3: value-with-modifier
+# expect+2: value
+# expect+1: value-with-modifier
. info ${:U\$}
-make: "directive-for-escape.mk" line 62: $
+make: "directive-for-escape.mk" line 69: $
For: loop body with i = ${V}:
+# expect: . info ${:U\$}
+# expect+6: $
+# expect: . info ${:U${V}}
+# expect+4: value
+# expect+3: value-with-modifier
+# expect+2: value
+# expect+1: value-with-modifier
. info ${:U${V}}
-make: "directive-for-escape.mk" line 62: value
+make: "directive-for-escape.mk" line 69: value
For: loop body with i = ${V:=-with-modifier}:
+# expect: . info ${:U\$}
+# expect+6: $
+# expect: . info ${:U${V}}
+# expect+4: value
+# expect+3: value-with-modifier
+# expect+2: value
+# expect+1: value-with-modifier
. info ${:U${V:=-with-modifier}}
-make: "directive-for-escape.mk" line 62: value-with-modifier
+make: "directive-for-escape.mk" line 69: value-with-modifier
For: loop body with i = $(V):
+# expect: . info ${:U\$}
+# expect+6: $
+# expect: . info ${:U${V}}
+# expect+4: value
+# expect+3: value-with-modifier
+# expect+2: value
+# expect+1: value-with-modifier
. info ${:U$(V)}
-make: "directive-for-escape.mk" line 62: value
+make: "directive-for-escape.mk" line 69: value
For: loop body with i = $(V:=-with-modifier):
+# expect: . info ${:U\$}
+# expect+6: $
+# expect: . info ${:U${V}}
+# expect+4: value
+# expect+3: value-with-modifier
+# expect+2: value
+# expect+1: value-with-modifier
. info ${:U$(V:=-with-modifier)}
-make: "directive-for-escape.mk" line 62: value-with-modifier
+make: "directive-for-escape.mk" line 69: value-with-modifier
For: end for 1
For: loop body with i = ${UNDEF:U\$\$:
# ${:U\${UNDEF\:U\\$\\$}
@@ -55,82 +140,105 @@ For: loop body with i = end}:
# ${:Uend\}}
For: end for 1
For: loop body with i = ${UNDEF:U\$\$:
+# expect+3: ${UNDEF:U\backslash$
+# expect+2: {{}}
+# expect+1: end}
. info ${:U\${UNDEF\:U\\$\\$}
-make: "directive-for-escape.mk" line 117: ${UNDEF:U\backslash$
+make: "directive-for-escape.mk" line 120: ${UNDEF:U\backslash$
For: loop body with i = {{}}:
+# expect+3: ${UNDEF:U\backslash$
+# expect+2: {{}}
+# expect+1: end}
. info ${:U{{\}\}}
-make: "directive-for-escape.mk" line 117: {{}}
+make: "directive-for-escape.mk" line 120: {{}}
For: loop body with i = end}:
+# expect+3: ${UNDEF:U\backslash$
+# expect+2: {{}}
+# expect+1: end}
. info ${:Uend\}}
-make: "directive-for-escape.mk" line 117: end}
+make: "directive-for-escape.mk" line 120: end}
For: end for 1
For: loop body with i = begin<${UNDEF:Ufallback:N{{{}}}}>end:
+# expect+1: begin<fallback>end
. info ${:Ubegin<${UNDEF:Ufallback:N{{{}}}}>end}
make: "directive-for-escape.mk" line 138: begin<fallback>end
For: end for 1
For: loop body with i = $:
+# expect+1: $
. info ${:U\$}
make: "directive-for-escape.mk" line 147: $
-make: "directive-for-escape.mk" line 156: invalid character ':' in .for loop variable name
+make: "directive-for-escape.mk" line 155: invalid character ':' in .for loop variable name
For: end for 1
-make: "directive-for-escape.mk" line 166: invalid character '}' in .for loop variable name
+make: "directive-for-escape.mk" line 165: invalid character '}' in .for loop variable name
For: end for 1
For: end for 1
For: loop body with i = inner:
+# expect+1: . ${:Uinner}: inner
. info . $$i: ${:Uinner}
+# expect+1: . ${:Uinner}: inner
. info . $${i}: ${:Uinner}
+# expect+1: . ${:Uinner:M*}: inner
. info . $${i:M*}: ${:Uinner:M*}
+# expect+1: . $(:Uinner): inner
. info . $$(i): $(:Uinner)
+# expect+1: . $(:Uinner:M*): inner
. info . $$(i:M*): $(:Uinner:M*)
+# expect+1: . ${i${:U}}: outer
. info . $${i$${:U}}: ${i${:U}}
+# expect+1: . ${:Uinner\}}: inner}
. info . $${i\}}: ${:Uinner\}} # XXX: unclear why ForLoop_SubstVarLong needs this
+# expect+1: . ${i2}: two
. info . $${i2}: ${i2}
+# expect+1: . ${i,}: comma
. info . $${i,}: ${i,}
+# expect+1: . adjacent: innerinnerinnerinner
. info . adjacent: ${:Uinner}${:Uinner}${:Uinner:M*}${:Uinner}
make: "directive-for-escape.mk" line 175: . $i: inner
-make: "directive-for-escape.mk" line 176: . ${i}: inner
-make: "directive-for-escape.mk" line 177: . ${i:M*}: inner
-make: "directive-for-escape.mk" line 178: . $(i): inner
-make: "directive-for-escape.mk" line 179: . $(i:M*): inner
-make: "directive-for-escape.mk" line 180: . ${i${:U}}: outer
-make: "directive-for-escape.mk" line 181: . ${i\}}: inner}
-make: "directive-for-escape.mk" line 182: . ${i2}: two
-make: "directive-for-escape.mk" line 183: . ${i,}: comma
-make: "directive-for-escape.mk" line 184: . adjacent: innerinnerinnerinner
-make: "directive-for-escape.mk" line 203: invalid character '$' in .for loop variable name
+make: "directive-for-escape.mk" line 177: . ${i}: inner
+make: "directive-for-escape.mk" line 179: . ${i:M*}: inner
+make: "directive-for-escape.mk" line 181: . $(i): inner
+make: "directive-for-escape.mk" line 183: . $(i:M*): inner
+make: "directive-for-escape.mk" line 185: . ${i${:U}}: outer
+make: "directive-for-escape.mk" line 187: . ${i\}}: inner}
+make: "directive-for-escape.mk" line 189: . ${i2}: two
+make: "directive-for-escape.mk" line 191: . ${i,}: comma
+make: "directive-for-escape.mk" line 193: . adjacent: innerinnerinnerinner
+make: "directive-for-escape.mk" line 202: invalid character '$' in .for loop variable name
For: end for 1
-make: "directive-for-escape.mk" line 215: eight and no cents.
+make: "directive-for-escape.mk" line 214: eight and no cents.
For: end for 1
-make: "directive-for-escape.mk" line 228: newline in .for value
- in .for loop from directive-for-escape.mk:228 with i = "
+make: "directive-for-escape.mk" line 227: newline in .for value
+ in .for loop from directive-for-escape.mk:227 with i = "
"
-make: "directive-for-escape.mk" line 228: newline in .for value
- in .for loop from directive-for-escape.mk:228 with i = "
+make: "directive-for-escape.mk" line 227: newline in .for value
+ in .for loop from directive-for-escape.mk:227 with i = "
"
For: loop body with i = "
":
+# expect+1: short: " "
. info short: ${:U" "}
+# expect+1: long: " "
. info long: ${:U" "}
make: "directive-for-escape.mk" line 229: short: " "
-make: "directive-for-escape.mk" line 230: long: " "
+make: "directive-for-escape.mk" line 231: long: " "
For: end for 1
For: loop body with i = "
":
-Parsing line 246: .for i in "${.newline}"
+Parsing line 244: .for i in "${.newline}"
For: end for 1
-Parse_PushInput: .for loop in directive-for-escape.mk, line 246
-make: "directive-for-escape.mk" line 246: newline in .for value
- in .for loop from directive-for-escape.mk:246 with i = "
+Parse_PushInput: .for loop in directive-for-escape.mk, line 244
+make: "directive-for-escape.mk" line 244: newline in .for value
+ in .for loop from directive-for-escape.mk:244 with i = "
"
For: loop body with i = "
":
: ${:U" "}
SetFilenameVars: ${.PARSEDIR} = <some-dir> ${.PARSEFILE} = `directive-for-escape.mk'
-Parsing line 247: : ${:U" "}
+Parsing line 245: : ${:U" "}
ParseDependency(: " ")
-ParseEOF: returning to file directive-for-escape.mk, line 249
+ParseEOF: returning to file directive-for-escape.mk, line 247
SetFilenameVars: ${.PARSEDIR} = <some-dir> ${.PARSEFILE} = `directive-for-escape.mk'
-Parsing line 249: .MAKEFLAGS: -d0
+Parsing line 247: .MAKEFLAGS: -d0
ParseDependency(.MAKEFLAGS: -d0)
For: end for 1
For: loop body with i = #:
Index: src/usr.bin/make/unit-tests/directive-for-escape.mk
diff -u src/usr.bin/make/unit-tests/directive-for-escape.mk:1.26 src/usr.bin/make/unit-tests/directive-for-escape.mk:1.27
--- src/usr.bin/make/unit-tests/directive-for-escape.mk:1.26 Fri Jul 5 19:47:22 2024
+++ src/usr.bin/make/unit-tests/directive-for-escape.mk Sat Jul 6 10:14:35 2024
@@ -1,4 +1,4 @@
-# $NetBSD: directive-for-escape.mk,v 1.26 2024/07/05 19:47:22 rillig Exp $
+# $NetBSD: directive-for-escape.mk,v 1.27 2024/07/06 10:14:35 rillig Exp $
#
# Test escaping of special characters in the iteration values of a .for loop.
# These values get expanded later using the :U variable modifier, and this
@@ -44,30 +44,30 @@ ASCII.2020-12-31= !"\\\#$$%&'()*+,-./0-9
V= value
VALUES= $$ $${V} $${V:=-with-modifier} $$(V) $$(V:=-with-modifier)
.for i in ${VALUES}
-. info $i
-.endfor
# expect: . info ${:U\$}
-# expect-3: $
+# expect+9: $
# expect: . info ${:U${V}}
-# expect-5: value
+# expect+7: value
# expect: . info ${:U${V:=-with-modifier}}
-# expect-7: value-with-modifier
+# expect+5: value-with-modifier
# expect: . info ${:U$(V)}
-# expect-9: value
+# expect+3: value
# expect: . info ${:U$(V:=-with-modifier)}
-# expect-11: value-with-modifier
+# expect+1: value-with-modifier
+. info $i
+.endfor
#
# Providing the loop items directly has the same effect.
.for i in $$ $${V} $${V:=-with-modifier} $$(V) $$(V:=-with-modifier)
-. info $i
-.endfor
# expect: . info ${:U\$}
-# expect-3: $
+# expect+6: $
# expect: . info ${:U${V}}
-# expect-5: value
-# expect-6: value-with-modifier
-# expect-7: value
-# expect-8: value-with-modifier
+# expect+4: value
+# expect+3: value-with-modifier
+# expect+2: value
+# expect+1: value-with-modifier
+. info $i
+.endfor
# Try to cover the code for nested '{}' in ExprLen, without success.
#
@@ -114,13 +114,12 @@ VALUES= $${UNDEF:U\$$\$$ {{}} end}
# To make the expression '$\' visible, define it to an actual word:
${:U\\}= backslash
.for i in ${VALUES}
+# expect+3: ${UNDEF:U\backslash$
+# expect+2: {{}}
+# expect+1: end}
. info $i
.endfor
#
-# expect-3: ${UNDEF:U\backslash$
-# expect-4: {{}}
-# expect-5: end}
-#
# FIXME: There was no expression '$\' in the original text of the variable
# 'VALUES', that's a surprise in the parser.
@@ -135,18 +134,18 @@ ${:U\\}= backslash
# Var_Parse do all the parsing work.
VALUES= begin<$${UNDEF:Ufallback:N{{{}}}}>end
.for i in ${VALUES}
+# expect+1: begin<fallback>end
. info $i
.endfor
-# expect-2: begin<fallback>end
# A single trailing dollar doesn't happen in practice.
# The dollar sign is correctly passed through to the body of the .for loop.
# There, it is expanded by the .info directive, but even there a trailing
# dollar sign is kept as-is.
.for i in ${:U\$}
+# expect+1: $
. info ${i}
.endfor
-# expect-2: $
# Before for.c 1.173 from 2023-05-08, the name of the iteration variable
# could contain colons, which affected expressions having this exact
@@ -172,27 +171,27 @@ i= outer
i2= two
i,= comma
.for i in inner
+# expect+1: . $i: inner
. info . $$i: $i
+# expect+1: . ${i}: inner
. info . $${i}: ${i}
+# expect+1: . ${i:M*}: inner
. info . $${i:M*}: ${i:M*}
+# expect+1: . $(i): inner
. info . $$(i): $(i)
+# expect+1: . $(i:M*): inner
. info . $$(i:M*): $(i:M*)
+# expect+1: . ${i${:U}}: outer
. info . $${i$${:U}}: ${i${:U}}
+# expect+1: . ${i\}}: inner}
. info . $${i\}}: ${i\}} # XXX: unclear why ForLoop_SubstVarLong needs this
+# expect+1: . ${i2}: two
. info . $${i2}: ${i2}
+# expect+1: . ${i,}: comma
. info . $${i,}: ${i,}
+# expect+1: . adjacent: innerinnerinnerinner
. info . adjacent: $i${i}${i:M*}$i
.endfor
-# expect-11: . $i: inner
-# expect-11: . ${i}: inner
-# expect-11: . ${i:M*}: inner
-# expect-11: . $(i): inner
-# expect-11: . $(i:M*): inner
-# expect-11: . ${i${:U}}: outer
-# expect-11: . ${i\}}: inner}
-# expect-11: . ${i2}: two
-# expect-11: . ${i,}: comma
-# expect-11: . adjacent: innerinnerinnerinner
# Before for.c 1.173 from 2023-05-08, the variable name could be a single '$'
# since there was no check on valid variable names. ForLoop_SubstVarShort
@@ -226,13 +225,12 @@ ${closing-brace}= <closing-brace> # alte
# expect+2: newline in .for value
# expect+1: newline in .for value
.for i in "${.newline}"
+# expect+1: short: " "
. info short: $i
+# expect+1: long: " "
. info long: ${i}
.endfor
-# expect-3: short: " "
-# expect-3: long: " "
-
-# No error since the newline character is not actually used.
+# No error since the newline character is not actually used in the body.
.for i in "${.newline}"
.endfor
Index: src/usr.bin/make/unit-tests/directive-for.mk
diff -u src/usr.bin/make/unit-tests/directive-for.mk:1.26 src/usr.bin/make/unit-tests/directive-for.mk:1.27
--- src/usr.bin/make/unit-tests/directive-for.mk:1.26 Fri Jul 5 19:47:22 2024
+++ src/usr.bin/make/unit-tests/directive-for.mk Sat Jul 6 10:14:35 2024
@@ -1,4 +1,4 @@
-# $NetBSD: directive-for.mk,v 1.26 2024/07/05 19:47:22 rillig Exp $
+# $NetBSD: directive-for.mk,v 1.27 2024/07/06 10:14:35 rillig Exp $
#
# Tests for the .for directive.
#
@@ -132,31 +132,31 @@ EXPANSION${plus}= value
# variable values have been replaced with expressions of the form ${:U...},
# which are not interpreted as code anymore.
.for path in a:\ a:\file.txt d:\\ d:\\file.txt
+# expect+3: a:\ a:\file.txt
+# expect+2: d:\\
+# expect+1: d:\\file.txt
. info ${path}
.endfor
-# expect-2: a:\ a:\file.txt
-# expect-3: d:\\
-# expect-4: d:\\file.txt
# Ensure that braces and parentheses are properly escaped by the .for loop.
# Each line must print the same word 3 times.
# See ForLoop_SubstBody.
.for v in ( [ { ) ] } (()) [[]] {{}} )( ][ }{
+# expect+12: ( ( (
+# expect+11: [ [ [
+# expect+10: { { {
+# expect+9: ) ) )
+# expect+8: ] ] ]
+# expect+7: } } }
+# expect+6: (()) (()) (())
+# expect+5: [[]] [[]] [[]]
+# expect+4: {{}} {{}} {{}}
+# expect+3: )( )( )(
+# expect+2: ][ ][ ][
+# expect+1: }{ }{ }{
. info $v ${v} $(v)
.endfor
-# expect-02: ( ( (
-# expect-03: [ [ [
-# expect-04: { { {
-# expect-05: ) ) )
-# expect-06: ] ] ]
-# expect-07: } } }
-# expect-08: (()) (()) (())
-# expect-09: [[]] [[]] [[]]
-# expect-10: {{}} {{}} {{}}
-# expect-11: )( )( )(
-# expect-12: ][ ][ ][
-# expect-13: }{ }{ }{
# Before 2023-05-09, the variable names could contain arbitrary characters,
# except for whitespace, allowing for creative side effects, as usual for
@@ -208,11 +208,11 @@ INDIRECT= ${DIRECT}
# usual.
# expect+1: while evaluating "${:Uword2:Z}-after word3" with value "word2": Unknown modifier "Z"
.for var in word1 before-${:Uword2:Z}-after word3
+# expect+3: XXX: Should not reach word1
+# expect+2: XXX: Should not reach before--after
+# expect+1: XXX: Should not reach word3
. info XXX: Should not reach ${var}
.endfor
-# expect-2: XXX: Should not reach word1
-# expect-3: XXX: Should not reach before--after
-# expect-4: XXX: Should not reach word3
# An empty list of variables to the left of the 'in' is a parse error.
@@ -315,6 +315,6 @@ INDIRECT= ${DIRECT}
# Back then, the .newline variable didn't exist, therefore it was unlikely
# that a newline ever occurred.
.for var in a${.newline}b${.newline}c
+# expect+1: newline-item=(a)
. info newline-item=(${var})
.endfor
-# expect-2: newline-item=(a)
Index: src/usr.bin/make/unit-tests/directive-for.exp
diff -u src/usr.bin/make/unit-tests/directive-for.exp:1.24 src/usr.bin/make/unit-tests/directive-for.exp:1.25
--- src/usr.bin/make/unit-tests/directive-for.exp:1.24 Fri Jul 5 19:47:22 2024
+++ src/usr.bin/make/unit-tests/directive-for.exp Sat Jul 6 10:14:35 2024
@@ -1,26 +1,26 @@
make: "directive-for.mk" line 117: outer
-make: "directive-for.mk" line 135: a:\ a:\file.txt
-make: "directive-for.mk" line 135: d:\\
-make: "directive-for.mk" line 135: d:\\file.txt
-make: "directive-for.mk" line 146: ( ( (
-make: "directive-for.mk" line 146: [ [ [
-make: "directive-for.mk" line 146: { { {
-make: "directive-for.mk" line 146: ) ) )
-make: "directive-for.mk" line 146: ] ] ]
-make: "directive-for.mk" line 146: } } }
-make: "directive-for.mk" line 146: (()) (()) (())
-make: "directive-for.mk" line 146: [[]] [[]] [[]]
-make: "directive-for.mk" line 146: {{}} {{}} {{}}
-make: "directive-for.mk" line 146: )( )( )(
-make: "directive-for.mk" line 146: ][ ][ ][
-make: "directive-for.mk" line 146: }{ }{ }{
+make: "directive-for.mk" line 138: a:\ a:\file.txt
+make: "directive-for.mk" line 138: d:\\
+make: "directive-for.mk" line 138: d:\\file.txt
+make: "directive-for.mk" line 158: ( ( (
+make: "directive-for.mk" line 158: [ [ [
+make: "directive-for.mk" line 158: { { {
+make: "directive-for.mk" line 158: ) ) )
+make: "directive-for.mk" line 158: ] ] ]
+make: "directive-for.mk" line 158: } } }
+make: "directive-for.mk" line 158: (()) (()) (())
+make: "directive-for.mk" line 158: [[]] [[]] [[]]
+make: "directive-for.mk" line 158: {{}} {{}} {{}}
+make: "directive-for.mk" line 158: )( )( )(
+make: "directive-for.mk" line 158: ][ ][ ][
+make: "directive-for.mk" line 158: }{ }{ }{
make: "directive-for.mk" line 166: invalid character ':' in .for loop variable name
make: "directive-for.mk" line 173: invalid character '$' in .for loop variable name
make: "directive-for.mk" line 185: invalid character '$' in .for loop variable name
make: "directive-for.mk" line 210: while evaluating "${:Uword2:Z}-after word3" with value "word2": Unknown modifier "Z"
-make: "directive-for.mk" line 211: XXX: Should not reach word1
-make: "directive-for.mk" line 211: XXX: Should not reach before--after
-make: "directive-for.mk" line 211: XXX: Should not reach word3
+make: "directive-for.mk" line 214: XXX: Should not reach word1
+make: "directive-for.mk" line 214: XXX: Should not reach before--after
+make: "directive-for.mk" line 214: XXX: Should not reach word3
make: "directive-for.mk" line 219: no iteration variables in for
make: "directive-for.mk" line 245: 1 open conditional
in .for loop from directive-for.mk:243 with var = value
@@ -38,7 +38,7 @@ For: loop body with outer = o:
endfor
For: end for 1
For: loop body with inner = i:
-make: "directive-for.mk" line 318: newline-item=(a)
+make: "directive-for.mk" line 319: newline-item=(a)
make: Fatal errors encountered -- cannot continue
make: stopped in unit-tests
exit status 1
Index: src/usr.bin/make/unit-tests/varmod-edge.exp
diff -u src/usr.bin/make/unit-tests/varmod-edge.exp:1.23 src/usr.bin/make/unit-tests/varmod-edge.exp:1.24
--- src/usr.bin/make/unit-tests/varmod-edge.exp:1.23 Fri Jul 5 19:47:22 2024
+++ src/usr.bin/make/unit-tests/varmod-edge.exp Sat Jul 6 10:14:35 2024
@@ -1,31 +1,11 @@
-make: "varmod-edge.mk" line 186: ok M-paren
-make: "varmod-edge.mk" line 186: ok M-mixed
-make: "varmod-edge.mk" line 186: ok M-unescape
-make: "varmod-edge.mk" line 168: while evaluating variable "MOD.M-nest-mix" with value "${INP.M-nest-mix:M${:U*)}}": while evaluating variable "INP.M-nest-mix" with value "(parentheses)": while evaluating "${:U*)" with value "*)": Unclosed expression, expecting '}' for modifier "U*)"
- in .for loop from varmod-edge.mk:164 with test = M-nest-mix
-make: "varmod-edge.mk" line 186: ok M-nest-mix
-make: "varmod-edge.mk" line 186: ok M-nest-brk
-make: "varmod-edge.mk" line 186: ok M-pat-err
-make: "varmod-edge.mk" line 186: ok M-bsbs
-make: "varmod-edge.mk" line 186: ok M-bs1-par
-make: "varmod-edge.mk" line 186: ok M-bs2-par
-make: "varmod-edge.mk" line 186: ok M-128
-make: "varmod-edge.mk" line 186: ok eq-ext
-make: "varmod-edge.mk" line 186: ok eq-q
-make: "varmod-edge.mk" line 186: ok eq-bs
-make: "varmod-edge.mk" line 168: while evaluating variable "MOD.eq-esc" with value "${INP.eq-esc:a\=b}": while evaluating variable "INP.eq-esc" with value "file.c file...": Unfinished modifier ('=' missing)
- in .for loop from varmod-edge.mk:164 with test = eq-esc
-make: "varmod-edge.mk" line 186: ok eq-esc
-make: "varmod-edge.mk" line 186: ok colon
-make: "varmod-edge.mk" line 168: while evaluating variable "MOD.colons" with value "${INP.colons::::}": while evaluating variable "INP.colons" with value "value": Unknown modifier ":"
- in .for loop from varmod-edge.mk:164 with test = colons
-make: "varmod-edge.mk" line 168: while evaluating variable "MOD.colons" with value "${INP.colons::::}": while evaluating variable "INP.colons" with value "": Unknown modifier ":"
- in .for loop from varmod-edge.mk:164 with test = colons
-make: "varmod-edge.mk" line 186: ok colons
-make: "varmod-edge.mk" line 197: while evaluating "${:Z}" with value "": Unknown modifier "Z"
-make: "varmod-edge.mk" line 197: Malformed conditional (${:Z})
-make: "varmod-edge.mk" line 211: while evaluating "${:S,}" with value "": Unfinished modifier (',' missing)
-make: "varmod-edge.mk" line 211: Malformed conditional (${:S,})
+make: "varmod-edge.mk" line 60: while evaluating variable "MOD" with value "${INP:M${:U*)}}": while evaluating variable "INP" with value "(parentheses)": while evaluating "${:U*)" with value "*)": Unclosed expression, expecting '}' for modifier "U*)"
+make: "varmod-edge.mk" line 178: while evaluating variable "MOD" with value "${INP:a\=b}": while evaluating variable "INP" with value "file.c file...": Unfinished modifier ('=' missing)
+make: "varmod-edge.mk" line 194: while evaluating variable "MOD" with value "${INP::::}": while evaluating variable "INP" with value "value": Unknown modifier ":"
+make: "varmod-edge.mk" line 194: while evaluating variable "MOD" with value "${INP::::}": while evaluating variable "INP" with value "": Unknown modifier ":"
+make: "varmod-edge.mk" line 203: while evaluating "${:Z}" with value "": Unknown modifier "Z"
+make: "varmod-edge.mk" line 203: Malformed conditional (${:Z})
+make: "varmod-edge.mk" line 217: while evaluating "${:S,}" with value "": Unfinished modifier (',' missing)
+make: "varmod-edge.mk" line 217: Malformed conditional (${:S,})
make: Fatal errors encountered -- cannot continue
-make: stopped making "all" in unit-tests
+make: stopped in unit-tests
exit status 1
Index: src/usr.bin/make/unit-tests/varmod-edge.mk
diff -u src/usr.bin/make/unit-tests/varmod-edge.mk:1.25 src/usr.bin/make/unit-tests/varmod-edge.mk:1.26
--- src/usr.bin/make/unit-tests/varmod-edge.mk:1.25 Fri Jul 5 19:47:22 2024
+++ src/usr.bin/make/unit-tests/varmod-edge.mk Sat Jul 6 10:14:35 2024
@@ -1,4 +1,4 @@
-# $NetBSD: varmod-edge.mk,v 1.25 2024/07/05 19:47:22 rillig Exp $
+# $NetBSD: varmod-edge.mk,v 1.26 2024/07/06 10:14:35 rillig Exp $
#
# Tests for edge cases in variable modifiers.
#
@@ -10,19 +10,23 @@
# - MOD, the expression for testing the modifier
# - EXP, the expected output
-TESTS+= M-paren
-INP.M-paren= (parentheses) {braces} (opening closing) ()
-MOD.M-paren= ${INP.M-paren:M(*)}
-EXP.M-paren= (parentheses) ()
+INP= (parentheses) {braces} (opening closing) ()
+MOD= ${INP:M(*)}
+EXP= (parentheses) ()
+.if ${MOD} != ${EXP}
+. warning expected "${EXP}", got "${MOD}"
+.endif
# The first closing brace matches the opening parenthesis.
# The second closing brace actually ends the expression.
#
# XXX: This is unexpected but rarely occurs in practice.
-TESTS+= M-mixed
-INP.M-mixed= (paren-brace} (
-MOD.M-mixed= ${INP.M-mixed:M(*}}
-EXP.M-mixed= (paren-brace}
+INP= (paren-brace} (
+MOD= ${INP:M(*}}
+EXP= (paren-brace}
+.if ${MOD} != ${EXP}
+. warning expected "${EXP}", got "${MOD}"
+.endif
# After the :M modifier has parsed the pattern, only the closing brace
# and the colon are unescaped. The other characters are left as-is.
@@ -31,10 +35,12 @@ EXP.M-mixed= (paren-brace}
# Str_Match.
#
# XXX: This is unexpected. The opening brace should also be unescaped.
-TESTS+= M-unescape
-INP.M-unescape= ({}): \(\{\}\)\: \(\{}\):
-MOD.M-unescape= ${INP.M-unescape:M\\(\\{\\}\\)\\:}
-EXP.M-unescape= \(\{}\):
+INP= ({}): \(\{\}\)\: \(\{}\):
+MOD= ${INP:M\\(\\{\\}\\)\\:}
+EXP= \(\{}\):
+.if ${MOD} != ${EXP}
+. warning expected "${EXP}", got "${MOD}"
+.endif
# When the :M and :N modifiers are parsed, the pattern finishes as soon
# as open_parens + open_braces == closing_parens + closing_braces. This
@@ -47,21 +53,26 @@ EXP.M-unescape= \(\{}\):
# The final brace in the output comes from the end of M.nest-mix.
#
# XXX: This is unexpected but rarely occurs in practice.
-TESTS+= M-nest-mix
-INP.M-nest-mix= (parentheses)
-MOD.M-nest-mix= ${INP.M-nest-mix:M${:U*)}}
-EXP.M-nest-mix= (parentheses)}
+INP= (parentheses)
+MOD= ${INP:M${:U*)}}
+EXP= (parentheses)}
+# expect+1: while evaluating variable "MOD" with value "${INP:M${:U*)}}": while evaluating variable "INP" with value "(parentheses)": while evaluating "${:U*)" with value "*)": Unclosed expression, expecting '}' for modifier "U*)"
+.if ${MOD} != ${EXP}
+. warning expected "${EXP}", got "${MOD}"
+.endif
# In contrast to parentheses and braces, the brackets are not counted
-# when the :M modifier is parsed since Makefile variables only take the
+# when the :M modifier is parsed since Makefile expressions only take the
# ${VAR} or $(VAR) forms, but not $[VAR].
#
# The final ] in the pattern is needed to close the character class.
-TESTS+= M-nest-brk
-INP.M-nest-brk= [ [[ [[[
-MOD.M-nest-brk= ${INP.M-nest-brk:M${:U[[[[[]}}
-EXP.M-nest-brk= [
+INP= [ [[ [[[
+MOD= ${INP:M${:U[[[[[]}}
+EXP= [
+.if ${MOD} != ${EXP}
+. warning expected "${EXP}", got "${MOD}"
+.endif
# The pattern in the nested variable has an unclosed character class.
# No error is reported though, and the pattern is closed implicitly.
@@ -71,26 +82,30 @@ EXP.M-nest-brk= [
#
# Before 2019-12-02, this test case triggered an out-of-bounds read
# in Str_Match.
-TESTS+= M-pat-err
-INP.M-pat-err= [ [[ [[[
-MOD.M-pat-err= ${INP.M-pat-err:M${:U[[}}
-EXP.M-pat-err= [
+INP= [ [[ [[[
+MOD= ${INP:M${:U[[}}
+EXP= [
+.if ${MOD} != ${EXP}
+. warning expected "${EXP}", got "${MOD}"
+.endif
# The first backslash does not escape the second backslash.
# Therefore, the second backslash escapes the parenthesis.
# This means that the pattern ends there.
-# The final } in the output comes from the end of MOD.M-bsbs.
+# The final } in the output comes from the end of MOD.
#
# If the first backslash were to escape the second backslash, the first
-# closing brace would match the opening parenthesis (see M-mixed), and
+# closing brace would match the opening parenthesis (see paren-brace), and
# the second closing brace would be needed to close the variable.
# After that, the remaining backslash would escape the parenthesis in
# the pattern, therefore (} would match.
-TESTS+= M-bsbs
-INP.M-bsbs= (} \( \(}
-MOD.M-bsbs= ${INP.M-bsbs:M\\(}}
-EXP.M-bsbs= \(}
-#EXP.M-bsbs= (} # If the first backslash were to escape ...
+INP= (} \( \(}
+MOD= ${INP:M\\(}}
+EXP= \(}
+#EXP= (} # If the first backslash were to escape ...
+.if ${MOD} != ${EXP}
+. warning expected "${EXP}", got "${MOD}"
+.endif
# The backslash in \( does not escape the parenthesis, therefore it
# counts for the nesting level and matches with the first closing brace.
@@ -99,95 +114,86 @@ EXP.M-bsbs= \(}
#
# The second :M in the pattern is nested between ( and }, therefore it
# does not start a new modifier.
-TESTS+= M-bs1-par
-INP.M-bs1-par= ( (:M (:M} \( \(:M \(:M}
-MOD.M-bs1-par= ${INP.M-bs1-par:M\(:M*}}}
-EXP.M-bs1-par= (:M}}
+INP= ( (:M (:M} \( \(:M \(:M}
+MOD= ${INP:M\(:M*}}}
+EXP= (:M}}
+.if ${MOD} != ${EXP}
+. warning expected "${EXP}", got "${MOD}"
+.endif
# The double backslash is passed verbatim to the pattern matcher.
# The Str_Match pattern is \\(:M*}, and there the backslash is unescaped.
# Again, the ( takes place in the nesting level, and there is no way to
# prevent this, no matter how many backslashes are used.
-TESTS+= M-bs2-par
-INP.M-bs2-par= ( (:M (:M} \( \(:M \(:M}
-MOD.M-bs2-par= ${INP.M-bs2-par:M\\(:M*}}}
-EXP.M-bs2-par= \(:M}}
-
-# Str_Match uses a recursive algorithm for matching the * patterns.
-# Make sure that it survives patterns with 128 asterisks.
-# That should be enough for all practical purposes.
-# To produce a stack overflow, just add more :Qs below.
-TESTS+= M-128
-INP.M-128= ${:U\\:Q:Q:Q:Q:Q:Q:Q:S,\\,x,g}
-PAT.M-128= ${:U\\:Q:Q:Q:Q:Q:Q:Q:S,\\,*,g}
-MOD.M-128= ${INP.M-128:M${PAT.M-128}}
-EXP.M-128= ${INP.M-128}
+INP= ( (:M (:M} \( \(:M \(:M}
+MOD= ${INP:M\\(:M*}}}
+EXP= \(:M}}
+.if ${MOD} != ${EXP}
+. warning expected "${EXP}", got "${MOD}"
+.endif
+
+# Before str.c 1.48 from 2020-06-15, Str_Match used a recursive algorithm for
+# matching the '*' patterns and did not optimize for multiple '*' in a row.
+# Test a pattern with 65536 asterisks.
+INP= ${:U\\:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:S,\\,x,g}
+PAT= ${:U\\:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:S,\\,*,g}
+MOD= ${INP:M${PAT}}
+EXP= ${INP}
+.if ${MOD} != ${EXP}
+. warning expected "${EXP}", got "${MOD}"
+.endif
# This is the normal SysV substitution. Nothing surprising here.
-TESTS+= eq-ext
-INP.eq-ext= file.c file.cc
-MOD.eq-ext= ${INP.eq-ext:%.c=%.o}
-EXP.eq-ext= file.o file.cc
+INP= file.c file.cc
+MOD= ${INP:%.c=%.o}
+EXP= file.o file.cc
+.if ${MOD} != ${EXP}
+. warning expected "${EXP}", got "${MOD}"
+.endif
# The SysV := modifier is greedy and consumes all the modifier text
# up until the closing brace or parenthesis. The :Q may look like a
# modifier, but it really isn't, that's why it appears in the output.
-TESTS+= eq-q
-INP.eq-q= file.c file.cc
-MOD.eq-q= ${INP.eq-q:%.c=%.o:Q}
-EXP.eq-q= file.o:Q file.cc
+INP= file.c file.cc
+MOD= ${INP:%.c=%.o:Q}
+EXP= file.o:Q file.cc
+.if ${MOD} != ${EXP}
+. warning expected "${EXP}", got "${MOD}"
+.endif
# The = in the := modifier can be escaped.
-TESTS+= eq-bs
-INP.eq-bs= file.c file.c=%.o
-MOD.eq-bs= ${INP.eq-bs:%.c\=%.o=%.ext}
-EXP.eq-bs= file.c file.ext
+INP= file.c file.c=%.o
+MOD= ${INP:%.c\=%.o=%.ext}
+EXP= file.c file.ext
+.if ${MOD} != ${EXP}
+. warning expected "${EXP}", got "${MOD}"
+.endif
# Having only an escaped '=' results in a parse error.
# The call to "pattern.lhs = ParseModifierPart" fails.
-TESTS+= eq-esc
-INP.eq-esc= file.c file...
-MOD.eq-esc= ${INP.eq-esc:a\=b}
-EXP.eq-esc= # empty
-# make: Unfinished modifier for INP.eq-esc ('=' missing)
-
-TESTS+= colon
-INP.colon= value
-MOD.colon= ${INP.colon:}
-EXP.colon= value
-
-TESTS+= colons
-INP.colons= value
-MOD.colons= ${INP.colons::::}
-EXP.colons= # empty
-
-.for test in ${TESTS}
-# expect+3: while evaluating variable "MOD.eq-esc" with value "${INP.eq-esc:a\=b}": while evaluating variable "INP.eq-esc" with value "file.c file...": Unfinished modifier ('=' missing)
-# expect+2: while evaluating variable "MOD.colons" with value "${INP.colons::::}": while evaluating variable "INP.colons" with value "value": Unknown modifier ":"
-# expect+1: while evaluating variable "MOD.colons" with value "${INP.colons::::}": while evaluating variable "INP.colons" with value "": Unknown modifier ":"
-. if ${MOD.${test}} == ${EXP.${test}}
-# expect+17: ok M-paren
-# expect+16: ok M-mixed
-# expect+15: ok M-unescape
-# expect-4: while evaluating variable "MOD.M-nest-mix" with value "${INP.M-nest-mix:M${:U*)}}": while evaluating variable "INP.M-nest-mix" with value "(parentheses)": while evaluating "${:U*)" with value "*)": Unclosed expression, expecting '}' for modifier "U*)"
-# expect+13: ok M-nest-mix
-# expect+12: ok M-nest-brk
-# expect+11: ok M-pat-err
-# expect+10: ok M-bsbs
-# expect+09: ok M-bs1-par
-# expect+08: ok M-bs2-par
-# expect+07: ok M-128
-# expect+06: ok eq-ext
-# expect+05: ok eq-q
-# expect+04: ok eq-bs
-# expect+03: ok eq-esc
-# expect+02: ok colon
-# expect+01: ok colons
-. info ok ${test}
-. else
-. warning error in ${test}: expected "${EXP.${test}}", got "${MOD.${test}}"
-. endif
-.endfor
+INP= file.c file...
+MOD= ${INP:a\=b}
+EXP= # empty
+# expect+1: while evaluating variable "MOD" with value "${INP:a\=b}": while evaluating variable "INP" with value "file.c file...": Unfinished modifier ('=' missing)
+.if ${MOD} != ${EXP}
+. warning expected "${EXP}", got "${MOD}"
+.endif
+
+INP= value
+MOD= ${INP:}
+EXP= value
+.if ${MOD} != ${EXP}
+. warning expected "${EXP}", got "${MOD}"
+.endif
+
+INP= value
+MOD= ${INP::::}
+EXP= # empty
+# expect+2: while evaluating variable "MOD" with value "${INP::::}": while evaluating variable "INP" with value "value": Unknown modifier ":"
+# expect+1: while evaluating variable "MOD" with value "${INP::::}": while evaluating variable "INP" with value "": Unknown modifier ":"
+.if ${MOD} != ${EXP}
+. warning expected "${EXP}", got "${MOD}"
+.endif
# Even in expressions based on an unnamed variable, there may be errors.
# XXX: The error message should mention the variable name of the expression,
@@ -213,6 +219,3 @@ EXP.colons= # empty
.else
. error
.endif
-
-all:
- @echo ok