Module Name: src
Committed By: rillig
Date: Sat Mar 29 20:19:58 UTC 2025
Modified Files:
src/usr.bin/make/unit-tests: varmod.exp varmod.mk
Log Message:
tests/make: fix the documented modifier table
The SysV column was largely incorrect or too unspecific, stating N/A
when "no" was actually correct.
The modifiers differ in whether they fall back to the ":from=to"
modifier. The suggestion in https://bugs.freebsd.org/285726 to make more
of the modifiers fall back to the ":from=to" modifier thus becomes
nonobvious to decide.
To generate a diff of this commit:
cvs rdiff -u -r1.19 -r1.20 src/usr.bin/make/unit-tests/varmod.exp
cvs rdiff -u -r1.22 -r1.23 src/usr.bin/make/unit-tests/varmod.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.exp
diff -u src/usr.bin/make/unit-tests/varmod.exp:1.19 src/usr.bin/make/unit-tests/varmod.exp:1.20
--- src/usr.bin/make/unit-tests/varmod.exp:1.19 Sat Mar 29 11:24:34 2025
+++ src/usr.bin/make/unit-tests/varmod.exp Sat Mar 29 20:19:58 2025
@@ -1,45 +1,47 @@
-make: "varmod.mk" line 101: To escape a dollar, use \$, not $$, at "$$:L} != """
-make: "varmod.mk" line 101: Invalid variable name ':', at "$:L} != """
-make: "varmod.mk" line 107: Dollar followed by nothing
+make: "varmod.mk" line 111: To escape a dollar, use \$, not $$, at "$$:L} != """
+make: "varmod.mk" line 111: Invalid variable name ':', at "$:L} != """
+make: "varmod.mk" line 117: Dollar followed by nothing
while evaluating "${:Uword:@word@${word}$@} != "word"" with value "word"
-make: "varmod.mk" line 117: Missing delimiter ':' after modifier "P"
+make: "varmod.mk" line 127: Missing delimiter ':' after modifier "P"
while evaluating variable "VAR" with value "VAR"
-make: "varmod.mk" line 119: Missing argument for ".error"
-make: "varmod.mk" line 125: Bad modifier ":[99333000222000111000]"
+make: "varmod.mk" line 129: Missing argument for ".error"
+make: "varmod.mk" line 135: Bad modifier ":[99333000222000111000]"
while evaluating variable "word" with value "word"
-make: "varmod.mk" line 128: Bad modifier ":[2147483648]"
+make: "varmod.mk" line 138: Bad modifier ":[2147483648]"
while evaluating variable "word" with value "word"
-make: "varmod.mk" line 134: Invalid number "99333000222000111000}" for ':range' modifier
+make: "varmod.mk" line 144: Invalid number "99333000222000111000}" for ':range' modifier
while evaluating variable "word" with value "word"
-make: "varmod.mk" line 141: Invalid time value "\"
+make: "varmod.mk" line 151: Invalid time value "\"
while evaluating indirect modifiers "gmtime=\"
while evaluating "${:${:Ugmtime=\\}}" with value ""
-make: "varmod.mk" line 156: Dollar followed by nothing
+make: "varmod.mk" line 166: Dollar followed by nothing
while evaluating variable "VAR" with value "value$"
-make: "varmod.mk" line 162: Dollar followed by nothing
+make: "varmod.mk" line 172: Dollar followed by nothing
while evaluating variable "VAR" with value "value$"
-make: "varmod.mk" line 162: Dollar followed by nothing
- while evaluating variable "VAR" with value "value$ appended$"
make: "varmod.mk" line 172: Dollar followed by nothing
+ while evaluating variable "VAR" with value "value$ appended$"
+make: "varmod.mk" line 182: Dollar followed by nothing
while evaluating variable "word" with value "word"
-make: "varmod.mk" line 176: Bad modifier ":[$]"
+make: "varmod.mk" line 186: Bad modifier ":[$]"
while evaluating variable "word" with value ""
-make: "varmod.mk" line 193: Dollar followed by nothing
+make: "varmod.mk" line 203: Dollar followed by nothing
while evaluating variable "VAR" with value "value$ appended$"
-make: "varmod.mk" line 193: Invalid variable name '}', at "$} != "set""
+make: "varmod.mk" line 203: Invalid variable name '}', at "$} != "set""
while evaluating variable "VAR" with value "value<space>appended"
-make: "varmod.mk" line 197: Invalid variable name '}', at "$} != "fallback""
+make: "varmod.mk" line 207: Invalid variable name '}', at "$} != "fallback""
while evaluating "${:Ufallback$} != "fallback"" with value ""
-make: "varmod.mk" line 201: Invalid time value "1000$"
+make: "varmod.mk" line 211: Invalid time value "1000$"
while evaluating variable "%y" with value "%y"
-make: "varmod.mk" line 207: Invalid time value "1000$"
+make: "varmod.mk" line 217: Invalid time value "1000$"
while evaluating variable "%y" with value "%y"
-make: "varmod.mk" line 213: Dollar followed by nothing
+make: "varmod.mk" line 223: Dollar followed by nothing
while evaluating variable "word" with value "word"
-make: "varmod.mk" line 217: Dollar followed by nothing
+make: "varmod.mk" line 227: Dollar followed by nothing
while evaluating variable "word" with value "word"
-make: "varmod.mk" line 221: Invalid argument 'fallback$' for modifier ':mtime'
+make: "varmod.mk" line 231: Invalid argument 'fallback$' for modifier ':mtime'
while evaluating variable "." with value "."
+make: "varmod.mk" line 245: Missing delimiter ':' after modifier "L"
+ while evaluating variable "VAR" with value "VAR"
make: Fatal errors encountered -- cannot continue
make: stopped in unit-tests
exit status 1
Index: src/usr.bin/make/unit-tests/varmod.mk
diff -u src/usr.bin/make/unit-tests/varmod.mk:1.22 src/usr.bin/make/unit-tests/varmod.mk:1.23
--- src/usr.bin/make/unit-tests/varmod.mk:1.22 Sat Jan 11 20:54:46 2025
+++ src/usr.bin/make/unit-tests/varmod.mk Sat Mar 29 20:19:58 2025
@@ -1,4 +1,4 @@
-# $NetBSD: varmod.mk,v 1.22 2025/01/11 20:54:46 rillig Exp $
+# $NetBSD: varmod.mk,v 1.23 2025/03/29 20:19:58 rillig Exp $
#
# Tests for variable modifiers, such as :Q, :S,from,to or :Ufallback.
#
@@ -21,40 +21,50 @@
# * `individual`: parsing this modifier does not follow the common
# pattern of calling `ParseModifierPart`.
#
-# The SysV column says whether a parse error in the modifier falls back
-# trying the `:from=to` System V modifier.
+# The SysV column says whether a modifier falls back trying the `:from=to`
+# System V modifier. Remarks:
#
-# | **Operator** | **Behavior** | **Remarks** | **SysV** |
+# In the assignment modifiers `::=` and its variants, the `=` is part of
+# the modifier name, so they never fall back to the `:from=to` modifier.
+#
+# All no-colon modifiers get a "no", as the modifier name would be
+# trimmed off before the `:from=to` modifier could see them, for
+# example, ${VAR:LAR=ALUE} and ${VAR:L:AR=ALUE} behave the same.
+#
+# | **Modifier** | **Behavior** | **Remarks** | **SysV** |
# |--------------|--------------|--------------------|----------|
-# | `!` | no-colon | | no |
-# | `:=` | greedy | | yes |
-# | `?:` | greedy | | no |
-# | `@` | no-colon | | no |
-# | `C` | no-colon | | no |
-# | `D` | individual | custom parser | N/A |
-# | `E` | strict | | yes |
-# | `H` | strict | | yes |
-# | `L` | no-colon | | N/A |
-# | `M` | individual | custom parser | N/A |
-# | `N` | individual | custom parser | N/A |
-# | `O` | strict | only literal value | no |
-# | `P` | no-colon | | N/A |
-# | `Q` | strict | | yes |
-# | `R` | strict | | yes |
-# | `S` | no-colon | | N/A |
-# | `T` | strict | | N/A |
-# | `U` | individual | custom parser | N/A |
-# | `[` | strict | | no |
-# | `_` | individual | strcspn | yes |
-# | `gmtime` | strict | | yes |
-# | `hash` | strict | | N/A |
-# | `localtime` | strict | | yes |
-# | `q` | strict | | yes |
-# | `range` | strict | | N/A |
-# | `sh` | strict | | N/A |
-# | `t` | strict | | no |
-# | `u` | strict | | yes |
-# | `from=to` | greedy | SysV, fallback | N/A |
+# | ! | no-colon | | no |
+# | := | greedy | | no |
+# | :?= | greedy | | no |
+# | :+= | greedy | | no |
+# | :!= | greedy | | no |
+# | ?: | greedy | | no |
+# | @ | no-colon | | no |
+# | C | no-colon | | no |
+# | D | individual | custom parser | no |
+# | E | strict | | yes |
+# | H | strict | | yes |
+# | L | no-colon | | no |
+# | M | individual | custom parser | no |
+# | N | individual | custom parser | no |
+# | O | strict | only literal value | no |
+# | P | no-colon | | no |
+# | Q | strict | | yes |
+# | R | strict | | yes |
+# | S | no-colon | | no |
+# | T | strict | | yes |
+# | U | individual | custom parser | no |
+# | [ | strict | | no |
+# | _ | individual | strcspn | no |
+# | gmtime | strict | | no |
+# | hash | strict | | yes |
+# | localtime | strict | | no |
+# | q | strict | | yes |
+# | range | strict | | no |
+# | sh | strict | | yes |
+# | t | strict | | no |
+# | u | strict | | yes |
+# | from=to | greedy | SysV, fallback | --- |
# These tests assume
.MAKE.SAVE_DOLLARS = yes
@@ -229,3 +239,12 @@ VAR_DOLLAR= VAR$$
.if ${word:L:S,d,m$,} != "worm\$"
. error
.endif
+
+.undef VAR
+# expect+1: Missing delimiter ':' after modifier "L"
+.if ${VAR:LAR=ALUE} != "VALUE"
+. error
+.endif
+.if ${VAR:L:AR=ALUE} != "VALUE"
+. error
+.endif