Module Name: src
Committed By: rillig
Date: Sun Jun 30 15:21:24 UTC 2024
Modified Files:
src/usr.bin/make: var.c
src/usr.bin/make/unit-tests: moderrs.exp moderrs.mk opt-debug-file.exp
opt-debug-file.mk varmod-assign.exp varmod-assign.mk
varmod-edge.exp varmod-edge.mk varmod-subst-regex.exp
varmod-sysv.exp varmod-sysv.mk
Log Message:
make: error out on some more syntax errors
Previously, these errors only produced a message on stderr. They only
affected make's exit status when they were evaluated at parse time, but
not when evaluating the commands for a specific target right before
executing them.
The affected syntax errors are:
* invalid regular expressions in the ':C' modifier
* out-of-range references to regex groups in the ':C' modifier
* unfinished modifiers
To generate a diff of this commit:
cvs rdiff -u -r1.1124 -r1.1125 src/usr.bin/make/var.c
cvs rdiff -u -r1.36 -r1.37 src/usr.bin/make/unit-tests/moderrs.exp
cvs rdiff -u -r1.32 -r1.33 src/usr.bin/make/unit-tests/moderrs.mk
cvs rdiff -u -r1.7 -r1.8 src/usr.bin/make/unit-tests/opt-debug-file.exp \
src/usr.bin/make/unit-tests/varmod-subst-regex.exp
cvs rdiff -u -r1.10 -r1.11 src/usr.bin/make/unit-tests/opt-debug-file.mk
cvs rdiff -u -r1.22 -r1.23 src/usr.bin/make/unit-tests/varmod-assign.exp
cvs rdiff -u -r1.21 -r1.22 src/usr.bin/make/unit-tests/varmod-assign.mk
cvs rdiff -u -r1.17 -r1.18 src/usr.bin/make/unit-tests/varmod-edge.exp \
src/usr.bin/make/unit-tests/varmod-sysv.mk
cvs rdiff -u -r1.20 -r1.21 src/usr.bin/make/unit-tests/varmod-edge.mk
cvs rdiff -u -r1.11 -r1.12 src/usr.bin/make/unit-tests/varmod-sysv.exp
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/var.c
diff -u src/usr.bin/make/var.c:1.1124 src/usr.bin/make/var.c:1.1125
--- src/usr.bin/make/var.c:1.1124 Sun Jun 30 13:01:01 2024
+++ src/usr.bin/make/var.c Sun Jun 30 15:21:23 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: var.c,v 1.1124 2024/06/30 13:01:01 rillig Exp $ */
+/* $NetBSD: var.c,v 1.1125 2024/06/30 15:21:23 rillig Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1993
@@ -132,7 +132,7 @@
#include "metachar.h"
/* "@(#)var.c 8.3 (Berkeley) 3/19/94" */
-MAKE_RCSID("$NetBSD: var.c,v 1.1124 2024/06/30 13:01:01 rillig Exp $");
+MAKE_RCSID("$NetBSD: var.c,v 1.1125 2024/06/30 15:21:23 rillig Exp $");
/*
* Variables are defined using one of the VAR=value assignments. Their
@@ -1567,7 +1567,7 @@ RegexError(int reerr, const regex_t *pat
size_t errlen = regerror(reerr, pat, NULL, 0);
char *errbuf = bmake_malloc(errlen);
regerror(reerr, pat, errbuf, errlen);
- Error("%s: %s", str, errbuf);
+ Parse_Error(PARSE_FATAL, "%s: %s", str, errbuf);
free(errbuf);
}
@@ -1579,7 +1579,7 @@ RegexReplaceBackref(char ref, SepBuf *bu
unsigned int n = (unsigned)ref - '0';
if (n >= nsub)
- Error("No subexpression \\%u", n);
+ Parse_Error(PARSE_FATAL, "No subexpression \\%u", n);
else if (m[n].rm_so == -1) {
if (opts.strict)
Error("No match for subexpression \\%u", n);
@@ -2230,8 +2230,8 @@ ParseModifierPart(
*pp = p;
if (*p != end1 && *p != end2) {
- Error("Unfinished modifier for \"%s\" ('%c' missing)",
- ch->expr->name, end2);
+ Parse_Error(PARSE_FATAL,
+ "Unfinished modifier ('%c' missing)", end2);
LazyBuf_Done(part);
return false;
}
@@ -2933,7 +2933,8 @@ ApplyModifier_Subst(const char **pp, Mod
char delim = (*pp)[1];
if (delim == '\0') {
- Error("Missing delimiter for modifier ':S'");
+ Parse_Error(PARSE_FATAL,
+ "Missing delimiter for modifier ':S'");
(*pp)++;
return AMR_CLEANUP;
}
@@ -2982,7 +2983,8 @@ ApplyModifier_Regex(const char **pp, Mod
char delim = (*pp)[1];
if (delim == '\0') {
- Error("Missing delimiter for :C modifier");
+ Parse_Error(PARSE_FATAL,
+ "Missing delimiter for modifier ':C'");
(*pp)++;
return AMR_CLEANUP;
}
Index: src/usr.bin/make/unit-tests/moderrs.exp
diff -u src/usr.bin/make/unit-tests/moderrs.exp:1.36 src/usr.bin/make/unit-tests/moderrs.exp:1.37
--- src/usr.bin/make/unit-tests/moderrs.exp:1.36 Sun Jun 30 14:23:18 2024
+++ src/usr.bin/make/unit-tests/moderrs.exp Sun Jun 30 15:21:24 2024
@@ -1,8 +1,6 @@
-mod-unknown-direct:
make: in target "mod-unknown-direct": while evaluating variable "VAR": Unknown modifier "Z"
VAR:Z=before--after
-mod-unknown-indirect:
make: in target "mod-unknown-indirect": while evaluating variable "VAR": Unknown modifier "Z"
VAR:Z=before-inner}-after
@@ -14,14 +12,12 @@ unclosed-indirect:
make: Unclosed expression after indirect modifier, expecting '}' for variable "VAR"
VAR:S,V,v,=Thevariable
-unfinished-indirect:
-make: Unfinished modifier for "VAR" (',' missing)
+make: in target "unfinished-indirect": while evaluating variable "VAR": Unfinished modifier (',' missing)
VAR:S,V,v=
-unfinished-loop:
-make: Unfinished modifier for "UNDEF" ('@' missing)
+make: in target "unfinished-loop": while evaluating variable "UNDEF": Unfinished modifier ('@' missing)
-make: Unfinished modifier for "UNDEF" ('@' missing)
+make: in target "unfinished-loop": while evaluating variable "UNDEF": Unfinished modifier ('@' missing)
1 2 3
@@ -30,46 +26,42 @@ make: Unclosed expression, expecting '}'
1}... 2}... 3}...
1}... 2}... 3}...
-words:
-make: Unfinished modifier for "UNDEF" (']' missing)
+make: in target "words": while evaluating variable "UNDEF": Unfinished modifier (']' missing)
-make: Unfinished modifier for "UNDEF" (']' missing)
+make: in target "words": while evaluating variable "UNDEF": Unfinished modifier (']' missing)
13=
make: Bad modifier ":[123451234512345123451234512345]" for variable "UNDEF"
12345=S,^ok,:S,^3ok,}
-exclam:
-make: Unfinished modifier for "VARNAME" ('!' missing)
+make: in target "exclam": while evaluating variable "VARNAME": Unfinished modifier ('!' missing)
-make: Unfinished modifier for "!" ('!' missing)
+make: in target "exclam": while evaluating variable "!": Unfinished modifier ('!' missing)
-mod-subst-delimiter:
-make: Missing delimiter for modifier ':S'
+make: in target "mod-subst-delimiter": while evaluating variable "VAR": Missing delimiter for modifier ':S'
1:
-make: Unfinished modifier for "VAR" (',' missing)
+make: in target "mod-subst-delimiter": while evaluating variable "VAR": Unfinished modifier (',' missing)
2:
-make: Unfinished modifier for "VAR" (',' missing)
+make: in target "mod-subst-delimiter": while evaluating variable "VAR": Unfinished modifier (',' missing)
3:
-make: Unfinished modifier for "VAR" (',' missing)
+make: in target "mod-subst-delimiter": while evaluating variable "VAR": Unfinished modifier (',' missing)
4:
-make: Unfinished modifier for "VAR" (',' missing)
+make: in target "mod-subst-delimiter": while evaluating variable "VAR": Unfinished modifier (',' missing)
5:
make: Unclosed expression, expecting '}' for modifier "S,from,to," of variable "VAR" with value "TheVariable"
6: TheVariable
7: TheVariable
-mod-regex-delimiter:
-make: Missing delimiter for :C modifier
+make: in target "mod-regex-delimiter": while evaluating variable "VAR": Missing delimiter for modifier ':C'
1:
-make: Unfinished modifier for "VAR" (',' missing)
+make: in target "mod-regex-delimiter": while evaluating variable "VAR": Unfinished modifier (',' missing)
2:
-make: Unfinished modifier for "VAR" (',' missing)
+make: in target "mod-regex-delimiter": while evaluating variable "VAR": Unfinished modifier (',' missing)
3:
-make: Unfinished modifier for "VAR" (',' missing)
+make: in target "mod-regex-delimiter": while evaluating variable "VAR": Unfinished modifier (',' missing)
4:
-make: Unfinished modifier for "VAR" (',' missing)
+make: in target "mod-regex-delimiter": while evaluating variable "VAR": Unfinished modifier (',' missing)
5:
make: Unclosed expression, expecting '}' for modifier "C,from,to," of variable "VAR" with value "TheVariable"
6: TheVariable
@@ -95,23 +87,20 @@ make: Bad modifier ":t" for variable "FI
make: Bad modifier ":t" for variable "FIB"
M*}
-mod-ifelse-parse:
-make: Unfinished modifier for "FIB" (':' missing)
+make: in target "mod-ifelse-parse": while evaluating then-branch of condition "FIB": Unfinished modifier (':' missing)
-make: Unfinished modifier for "FIB" (':' missing)
+make: in target "mod-ifelse-parse": while evaluating then-branch of condition "FIB": Unfinished modifier (':' missing)
-make: Unfinished modifier for "FIB" ('}' missing)
+make: in target "mod-ifelse-parse": while evaluating else-branch of condition "FIB": Unfinished modifier ('}' missing)
-make: Unfinished modifier for "FIB" ('}' missing)
+make: in target "mod-ifelse-parse": while evaluating else-branch of condition "FIB": Unfinished modifier ('}' missing)
then
-mod-remember-parse:
1 1 2 3 5 8 13 21 34
make: in target "mod-remember-parse": while evaluating variable "FIB": Unknown modifier "__"
-mod-sysv-parse:
make: in target "mod-sysv-parse": while evaluating variable "FIB": Unknown modifier "3"
make: Unclosed expression, expecting '}' for modifier "3" of variable "FIB" with value ""
Index: src/usr.bin/make/unit-tests/moderrs.mk
diff -u src/usr.bin/make/unit-tests/moderrs.mk:1.32 src/usr.bin/make/unit-tests/moderrs.mk:1.33
--- src/usr.bin/make/unit-tests/moderrs.mk:1.32 Sun Jun 30 14:23:18 2024
+++ src/usr.bin/make/unit-tests/moderrs.mk Sun Jun 30 15:21:24 2024
@@ -1,4 +1,4 @@
-# $NetBSD: moderrs.mk,v 1.32 2024/06/30 14:23:18 rillig Exp $
+# $NetBSD: moderrs.mk,v 1.33 2024/06/30 15:21:24 rillig Exp $
#
# various modifier error tests
@@ -24,11 +24,11 @@ all: mod-ifelse-parse
all: mod-remember-parse
all: mod-sysv-parse
-mod-unknown-direct: print-header print-footer
+mod-unknown-direct: print-footer
# expect: make: in target "mod-unknown-direct": while evaluating variable "VAR": Unknown modifier "Z"
@echo 'VAR:Z=before-${VAR:Z}-after'
-mod-unknown-indirect: print-header print-footer
+mod-unknown-indirect: print-footer
# expect: make: in target "mod-unknown-indirect": while evaluating variable "VAR": Unknown modifier "Z"
@echo 'VAR:${MOD_UNKN}=before-${VAR:${MOD_UNKN}:inner}-after'
@@ -40,14 +40,14 @@ unclosed-indirect: print-header print-fo
# expect: make: Unclosed expression after indirect modifier, expecting '}' for variable "VAR"
@echo VAR:${MOD_TERM},=${VAR:${MOD_S}
-unfinished-indirect: print-header print-footer
-# expect: make: Unfinished modifier for "VAR" (',' missing)
+unfinished-indirect: print-footer
+# expect: make: in target "unfinished-indirect": while evaluating variable "VAR": Unfinished modifier (',' missing)
-@echo "VAR:${MOD_TERM}=${VAR:${MOD_TERM}}"
-unfinished-loop: print-header print-footer
-# expect: make: Unfinished modifier for "UNDEF" ('@' missing)
+unfinished-loop: print-footer
+# expect: make: in target "unfinished-loop": while evaluating variable "UNDEF": Unfinished modifier ('@' missing)
@echo ${UNDEF:U1 2 3:@var}
-# expect: make: Unfinished modifier for "UNDEF" ('@' missing)
+# expect: make: in target "unfinished-loop": while evaluating variable "UNDEF": Unfinished modifier ('@' missing)
@echo ${UNDEF:U1 2 3:@var@...}
@echo ${UNDEF:U1 2 3:@var@${var}@}
@@ -58,13 +58,14 @@ unfinished-loop: print-header print-foot
# This is also contrary to the SysV modifier, where only the actually
# used delimiter (either braces or parentheses) must be balanced.
loop-close: print-header print-footer
+# expect: make: Unclosed expression, expecting '}' for modifier "@var@${var}}...@" of variable "UNDEF" with value "1}... 2}... 3}..."
@echo ${UNDEF:U1 2 3:@var@${var}}...@
@echo ${UNDEF:U1 2 3:@var@${var}}...@}
-words: print-header print-footer
-# expect: make: Unfinished modifier for "UNDEF" (']' missing)
+words: print-footer
+# expect: make: in target "words": while evaluating variable "UNDEF": Unfinished modifier (']' missing)
@echo ${UNDEF:U1 2 3:[}
-# expect: make: Unfinished modifier for "UNDEF" (']' missing)
+# expect: make: in target "words": while evaluating variable "UNDEF": Unfinished modifier (']' missing)
@echo ${UNDEF:U1 2 3:[#}
# out of bounds => empty
@@ -89,61 +90,88 @@ words: print-header print-footer
# That variable is undefined, resulting in an empty string.
@echo 12345=${UNDEF:U1 2 3:[123451234512345123451234512345]:S,^$,ok,:S,^3$,ok,}
-exclam: print-header print-footer
-# expect: make: Unfinished modifier for "VARNAME" ('!' missing)
+exclam: print-footer
+# expect: make: in target "exclam": while evaluating variable "VARNAME": Unfinished modifier ('!' missing)
@echo ${VARNAME:!echo}
# When the final exclamation mark is missing, there is no
# fallback to the SysV substitution modifier.
# If there were a fallback, the output would be "exclam",
# and the above would have produced an "Unknown modifier '!'".
-# expect: make: Unfinished modifier for "!" ('!' missing)
+# expect: make: in target "exclam": while evaluating variable "!": Unfinished modifier ('!' missing)
@echo ${!:L:!=exclam}
-mod-subst-delimiter: print-header print-footer
+mod-subst-delimiter: print-footer
+# expect: make: in target "mod-subst-delimiter": while evaluating variable "VAR": Missing delimiter for modifier ':S'
@echo 1: ${VAR:S
+# expect: make: in target "mod-subst-delimiter": while evaluating variable "VAR": Unfinished modifier (',' missing)
@echo 2: ${VAR:S,
+# expect: make: in target "mod-subst-delimiter": while evaluating variable "VAR": Unfinished modifier (',' missing)
@echo 3: ${VAR:S,from
+# expect: make: in target "mod-subst-delimiter": while evaluating variable "VAR": Unfinished modifier (',' missing)
@echo 4: ${VAR:S,from,
+# expect: make: in target "mod-subst-delimiter": while evaluating variable "VAR": Unfinished modifier (',' missing)
@echo 5: ${VAR:S,from,to
+# expect: make: Unclosed expression, expecting '}' for modifier "S,from,to," of variable "VAR" with value "TheVariable"
@echo 6: ${VAR:S,from,to,
@echo 7: ${VAR:S,from,to,}
-mod-regex-delimiter: print-header print-footer
+mod-regex-delimiter: print-footer
+# expect: make: in target "mod-regex-delimiter": while evaluating variable "VAR": Missing delimiter for modifier ':C'
@echo 1: ${VAR:C
+# expect: make: in target "mod-regex-delimiter": while evaluating variable "VAR": Unfinished modifier (',' missing)
@echo 2: ${VAR:C,
+# expect: make: in target "mod-regex-delimiter": while evaluating variable "VAR": Unfinished modifier (',' missing)
@echo 3: ${VAR:C,from
+# expect: make: in target "mod-regex-delimiter": while evaluating variable "VAR": Unfinished modifier (',' missing)
@echo 4: ${VAR:C,from,
+# expect: make: in target "mod-regex-delimiter": while evaluating variable "VAR": Unfinished modifier (',' missing)
@echo 5: ${VAR:C,from,to
+# expect: make: Unclosed expression, expecting '}' for modifier "C,from,to," of variable "VAR" with value "TheVariable"
@echo 6: ${VAR:C,from,to,
@echo 7: ${VAR:C,from,to,}
mod-ts-parse: print-header print-footer
@echo ${FIB:ts}
@echo ${FIB:ts\65} # octal 065 == U+0035 == '5'
+# expect: make: Bad modifier ":ts\65oct" for variable "FIB"
@echo ${FIB:ts\65oct} # bad modifier
+# expect: make: Bad modifier ":ts\65oct" for variable ""
@echo ${:U${FIB}:ts\65oct} # bad modifier, variable name is ""
+# expect: make: Bad modifier ":tsxy" for variable "FIB"
@echo ${FIB:tsxy} # modifier too long
mod-t-parse: print-header print-footer
+# expect: make: Bad modifier ":t" for variable "FIB"
@echo ${FIB:t
+# expect: make: Bad modifier ":txy" for variable "FIB"
@echo ${FIB:txy}
+# expect: make: Bad modifier ":t" for variable "FIB"
@echo ${FIB:t}
+# expect: make: Bad modifier ":t" for variable "FIB"
@echo ${FIB:t:M*}
-mod-ifelse-parse: print-header print-footer
+mod-ifelse-parse: print-footer
+# expect: make: in target "mod-ifelse-parse": while evaluating then-branch of condition "FIB": Unfinished modifier (':' missing)
@echo ${FIB:?
+# expect: make: in target "mod-ifelse-parse": while evaluating then-branch of condition "FIB": Unfinished modifier (':' missing)
@echo ${FIB:?then
+# expect: make: in target "mod-ifelse-parse": while evaluating else-branch of condition "FIB": Unfinished modifier ('}' missing)
@echo ${FIB:?then:
+# expect: make: in target "mod-ifelse-parse": while evaluating else-branch of condition "FIB": Unfinished modifier ('}' missing)
@echo ${FIB:?then:else
@echo ${FIB:?then:else}
-mod-remember-parse: print-header print-footer
+mod-remember-parse: print-footer
@echo ${FIB:_} # ok
+# expect: make: in target "mod-remember-parse": while evaluating variable "FIB": Unknown modifier "__"
@echo ${FIB:__} # modifier name too long
-mod-sysv-parse: print-header print-footer
+mod-sysv-parse: print-footer
+# expect: make: in target "mod-sysv-parse": while evaluating variable "FIB": Unknown modifier "3"
@echo ${FIB:3
+# expect: make: in target "mod-sysv-parse": while evaluating variable "FIB": Unknown modifier "3="
@echo ${FIB:3=
+# expect: make: in target "mod-sysv-parse": while evaluating variable "FIB": Unknown modifier "3=x3"
@echo ${FIB:3=x3
@echo ${FIB:3=x3} # ok
Index: src/usr.bin/make/unit-tests/opt-debug-file.exp
diff -u src/usr.bin/make/unit-tests/opt-debug-file.exp:1.7 src/usr.bin/make/unit-tests/opt-debug-file.exp:1.8
--- src/usr.bin/make/unit-tests/opt-debug-file.exp:1.7 Thu Jun 1 20:56:35 2023
+++ src/usr.bin/make/unit-tests/opt-debug-file.exp Sun Jun 30 15:21:24 2024
@@ -3,10 +3,10 @@ make: "opt-debug-file.mk" line 47: This
make: "opt-debug-file.mk" line 50: This goes to stderr, and in addition to the debug log.
CondParser_Eval: ${:!cat opt-debug-file.debuglog!:Maddition:[#]} != 1
Comparing 1.000000 != 1.000000
-make: Missing delimiter for modifier ':S'
-make: Missing delimiter for modifier ':S'
-make: Missing delimiter for modifier ':S'
-CondParser_Eval: ${:!cat opt-debug-file.debuglog!:Mdelimiter:[#]} != 1
+make: Unterminated quoted string [make 'This goes to stdout only, once.]
+make: Unterminated quoted string [make 'This goes to stderr only, once.]
+make: Unterminated quoted string [make 'This goes to stderr, and in addition to the debug log.]
+CondParser_Eval: ${:!cat opt-debug-file.debuglog!:MUnterminated:[#]} != 1
Comparing 1.000000 != 1.000000
Cannot open debug file "/nonexistent-6f21c672-a22d-4ef7/opt-debug-file.debuglog"
exit status 2
Index: src/usr.bin/make/unit-tests/varmod-subst-regex.exp
diff -u src/usr.bin/make/unit-tests/varmod-subst-regex.exp:1.7 src/usr.bin/make/unit-tests/varmod-subst-regex.exp:1.8
--- src/usr.bin/make/unit-tests/varmod-subst-regex.exp:1.7 Sat Apr 20 10:18:55 2024
+++ src/usr.bin/make/unit-tests/varmod-subst-regex.exp Sun Jun 30 15:21:24 2024
@@ -1,24 +1,24 @@
-make: Regex compilation error: (details omitted)
+make: in target "mod-regex-compile-error": while evaluating "${:Uword1 word2:C,****,____,g:C,word,____,:Q}.": Regex compilation error: (details omitted)
mod-regex-compile-error: C,word,____,:Q}.
-make: No subexpression \1
-make: No subexpression \1
-make: No subexpression \1
-make: No subexpression \1
+make: in target "mod-regex-limits": while evaluating "${:U1 23 456:C,..,\1\1,:Q}": No subexpression \1
+make: in target "mod-regex-limits": while evaluating "${:U1 23 456:C,..,\1\1,:Q}": No subexpression \1
+make: in target "mod-regex-limits": while evaluating "${:U1 23 456:C,..,\1\1,:Q}": No subexpression \1
+make: in target "mod-regex-limits": while evaluating "${:U1 23 456:C,..,\1\1,:Q}": No subexpression \1
mod-regex-limits:11-missing:1 6
mod-regex-limits:11-ok:1 22 446
-make: No subexpression \2
-make: No subexpression \2
-make: No subexpression \2
-make: No subexpression \2
+make: in target "mod-regex-limits": while evaluating "${:U1 23 456:C,..,\2\2,:Q}": No subexpression \2
+make: in target "mod-regex-limits": while evaluating "${:U1 23 456:C,..,\2\2,:Q}": No subexpression \2
+make: in target "mod-regex-limits": while evaluating "${:U1 23 456:C,..,\2\2,:Q}": No subexpression \2
+make: in target "mod-regex-limits": while evaluating "${:U1 23 456:C,..,\2\2,:Q}": No subexpression \2
mod-regex-limits:22-missing:1 6
-make: No subexpression \2
-make: No subexpression \2
-make: No subexpression \2
-make: No subexpression \2
+make: in target "mod-regex-limits": while evaluating "${:U1 23 456:C,(.).,\2\2,:Q}": No subexpression \2
+make: in target "mod-regex-limits": while evaluating "${:U1 23 456:C,(.).,\2\2,:Q}": No subexpression \2
+make: in target "mod-regex-limits": while evaluating "${:U1 23 456:C,(.).,\2\2,:Q}": No subexpression \2
+make: in target "mod-regex-limits": while evaluating "${:U1 23 456:C,(.).,\2\2,:Q}": No subexpression \2
mod-regex-limits:22-missing:1 6
mod-regex-limits:22-ok:1 33 556
mod-regex-limits:capture:ihgfedcbaabcdefghijABCDEFGHIJa0a1a2rest
-make: Regex compilation error: (details omitted)
+make: in target "mod-regex-errors": while evaluating variable "UNDEF": Regex compilation error: (details omitted)
mod-regex-errors:
make: in target "mod-regex-errors": while evaluating variable "word": while evaluating "${:U:Z}y,W}": Unknown modifier "Z"
mod-regex-errors: xy
Index: src/usr.bin/make/unit-tests/opt-debug-file.mk
diff -u src/usr.bin/make/unit-tests/opt-debug-file.mk:1.10 src/usr.bin/make/unit-tests/opt-debug-file.mk:1.11
--- src/usr.bin/make/unit-tests/opt-debug-file.mk:1.10 Sun Nov 19 21:47:52 2023
+++ src/usr.bin/make/unit-tests/opt-debug-file.mk Sun Jun 30 15:21:24 2024
@@ -1,4 +1,4 @@
-# $NetBSD: opt-debug-file.mk,v 1.10 2023/11/19 21:47:52 rillig Exp $
+# $NetBSD: opt-debug-file.mk,v 1.11 2024/06/30 15:21:24 rillig Exp $
#
# Tests for the -dF command line option, which redirects the debug log
# to a file instead of writing it to stderr.
@@ -54,15 +54,18 @@ DEBUG_OUTPUT:= ${:!cat opt-debug-file.de
.endif
-# See ApplyModifier_Subst, which calls Error.
+# See Main_ParseArgLine, which calls Error.
.MAKEFLAGS: -dFstdout
-: This goes to stderr only, once. ${:U:S
+# expect: make: Unterminated quoted string [make 'This goes to stdout only, once.]
+.MAKEFLAGS: 'This goes to stdout only, once.
.MAKEFLAGS: -dFstderr
-: This goes to stderr only, once. ${:U:S
+# expect: make: Unterminated quoted string [make 'This goes to stderr only, once.]
+.MAKEFLAGS: 'This goes to stderr only, once.
.MAKEFLAGS: -dFopt-debug-file.debuglog
-: This goes to stderr, and in addition to the debug log. ${:U:S
+# expect: make: Unterminated quoted string [make 'This goes to stderr, and in addition to the debug log.]
+.MAKEFLAGS: 'This goes to stderr, and in addition to the debug log.
.MAKEFLAGS: -dFstderr -d0c
-.if ${:!cat opt-debug-file.debuglog!:Mdelimiter:[#]} != 1
+.if ${:!cat opt-debug-file.debuglog!:MUnterminated:[#]} != 1
. error
.endif
Index: src/usr.bin/make/unit-tests/varmod-assign.exp
diff -u src/usr.bin/make/unit-tests/varmod-assign.exp:1.22 src/usr.bin/make/unit-tests/varmod-assign.exp:1.23
--- src/usr.bin/make/unit-tests/varmod-assign.exp:1.22 Sun Jun 30 11:44:14 2024
+++ src/usr.bin/make/unit-tests/varmod-assign.exp Sun Jun 30 15:21:24 2024
@@ -45,7 +45,7 @@ mod-assign-empty: VAR=overwritten
make: in target "mod-assign-parse": while evaluating variable "ASSIGN": Unknown modifier ":x"
sysv:y
-make: Unfinished modifier for "ASSIGN" ('}' missing)
+make: in target "mod-assign-parse": while evaluating variable "ASSIGN": Unfinished modifier ('}' missing)
ok=word
make: warning: in target "mod-assign-shell-error": while evaluating variable "SH_ERR": Command " echo word; (exit 13) " exited with status 13
Index: src/usr.bin/make/unit-tests/varmod-assign.mk
diff -u src/usr.bin/make/unit-tests/varmod-assign.mk:1.21 src/usr.bin/make/unit-tests/varmod-assign.mk:1.22
--- src/usr.bin/make/unit-tests/varmod-assign.mk:1.21 Sun Jun 30 11:37:21 2024
+++ src/usr.bin/make/unit-tests/varmod-assign.mk Sun Jun 30 15:21:24 2024
@@ -1,4 +1,4 @@
-# $NetBSD: varmod-assign.mk,v 1.21 2024/06/30 11:37:21 rillig Exp $
+# $NetBSD: varmod-assign.mk,v 1.22 2024/06/30 15:21:24 rillig Exp $
#
# Tests for the obscure ::= variable modifiers, which perform variable
# assignments during evaluation, just like the = operator in C.
@@ -95,6 +95,7 @@ mod-assign-parse:
# When parsing an assignment operator fails because the operator is
# incomplete, make falls back to the SysV modifier.
+# expect: make: in target "mod-assign-parse": while evaluating variable "ASSIGN": Unfinished modifier ('}' missing)
@echo ${SYSV::=sysv\:x}${SYSV::x=:y}
@echo ${ASSIGN::=value # missing closing brace
Index: src/usr.bin/make/unit-tests/varmod-edge.exp
diff -u src/usr.bin/make/unit-tests/varmod-edge.exp:1.17 src/usr.bin/make/unit-tests/varmod-edge.exp:1.18
--- src/usr.bin/make/unit-tests/varmod-edge.exp:1.17 Sat Apr 20 10:18:55 2024
+++ src/usr.bin/make/unit-tests/varmod-edge.exp Sun Jun 30 15:21:24 2024
@@ -1,27 +1,27 @@
-make: "varmod-edge.mk" line 184: ok M-paren
-make: "varmod-edge.mk" line 184: ok M-mixed
-make: "varmod-edge.mk" line 184: ok M-unescape
+make: "varmod-edge.mk" line 185: ok M-paren
+make: "varmod-edge.mk" line 185: ok M-mixed
+make: "varmod-edge.mk" line 185: ok M-unescape
make: Unclosed expression, expecting '}' for modifier "U*)" of variable "" with value "*)"
-make: "varmod-edge.mk" line 184: ok M-nest-mix
-make: "varmod-edge.mk" line 184: ok M-nest-brk
-make: "varmod-edge.mk" line 184: ok M-pat-err
-make: "varmod-edge.mk" line 184: ok M-bsbs
-make: "varmod-edge.mk" line 184: ok M-bs1-par
-make: "varmod-edge.mk" line 184: ok M-bs2-par
-make: "varmod-edge.mk" line 184: ok M-128
-make: "varmod-edge.mk" line 184: ok eq-ext
-make: "varmod-edge.mk" line 184: ok eq-q
-make: "varmod-edge.mk" line 184: ok eq-bs
-make: Unfinished modifier for "INP.eq-esc" ('=' missing)
-make: "varmod-edge.mk" line 184: ok eq-esc
-make: "varmod-edge.mk" line 184: ok colon
-make: "varmod-edge.mk" line 167: while evaluating variable "MOD.colons": while evaluating variable "INP.colons": Unknown modifier ":"
-make: "varmod-edge.mk" line 167: while evaluating variable "MOD.colons": while evaluating variable "INP.colons": Unknown modifier ":"
-make: "varmod-edge.mk" line 184: ok colons
-make: "varmod-edge.mk" line 195: while evaluating "${:Z}": Unknown modifier "Z"
-make: "varmod-edge.mk" line 195: Malformed conditional (${:Z})
-make: Unfinished modifier for "" (',' missing)
-make: "varmod-edge.mk" line 209: Malformed conditional (${:S,})
+make: "varmod-edge.mk" line 185: ok M-nest-mix
+make: "varmod-edge.mk" line 185: ok M-nest-brk
+make: "varmod-edge.mk" line 185: ok M-pat-err
+make: "varmod-edge.mk" line 185: ok M-bsbs
+make: "varmod-edge.mk" line 185: ok M-bs1-par
+make: "varmod-edge.mk" line 185: ok M-bs2-par
+make: "varmod-edge.mk" line 185: ok M-128
+make: "varmod-edge.mk" line 185: ok eq-ext
+make: "varmod-edge.mk" line 185: ok eq-q
+make: "varmod-edge.mk" line 185: ok eq-bs
+make: "varmod-edge.mk" line 168: while evaluating variable "MOD.eq-esc": while evaluating variable "INP.eq-esc": Unfinished modifier ('=' missing)
+make: "varmod-edge.mk" line 185: ok eq-esc
+make: "varmod-edge.mk" line 185: ok colon
+make: "varmod-edge.mk" line 168: while evaluating variable "MOD.colons": while evaluating variable "INP.colons": Unknown modifier ":"
+make: "varmod-edge.mk" line 168: while evaluating variable "MOD.colons": while evaluating variable "INP.colons": Unknown modifier ":"
+make: "varmod-edge.mk" line 185: ok colons
+make: "varmod-edge.mk" line 196: while evaluating "${:Z}": Unknown modifier "Z"
+make: "varmod-edge.mk" line 196: Malformed conditional (${:Z})
+make: "varmod-edge.mk" line 210: while evaluating "${:S,}": Unfinished modifier (',' missing)
+make: "varmod-edge.mk" line 210: Malformed conditional (${:S,})
make: Fatal errors encountered -- cannot continue
make: stopped in unit-tests
exit status 1
Index: src/usr.bin/make/unit-tests/varmod-sysv.mk
diff -u src/usr.bin/make/unit-tests/varmod-sysv.mk:1.17 src/usr.bin/make/unit-tests/varmod-sysv.mk:1.18
--- src/usr.bin/make/unit-tests/varmod-sysv.mk:1.17 Sat Jun 1 18:44:05 2024
+++ src/usr.bin/make/unit-tests/varmod-sysv.mk Sun Jun 30 15:21:24 2024
@@ -1,4 +1,4 @@
-# $NetBSD: varmod-sysv.mk,v 1.17 2024/06/01 18:44:05 rillig Exp $
+# $NetBSD: varmod-sysv.mk,v 1.18 2024/06/30 15:21:24 rillig Exp $
#
# Tests for the variable modifier ':from=to', which replaces the suffix
# "from" with "to". It can also use '%' as a wildcard.
@@ -208,11 +208,12 @@
# This is not a SysV modifier since the nested expression expands
# to an empty string. The '=' in it should be irrelevant during parsing.
-# XXX: As of 2020-12-05, this expression generates an "Unfinished modifier"
+# XXX: As of 2024-06-30, this expression generates an "Unfinished modifier"
# error, while the correct error message would be "Unknown modifier" since
# there is no modifier named "fromto".
-# expect+1: Malformed conditional (${word214:L:from${:D=}to})
-.if ${word214:L:from${:D=}to}
+# expect+2: while evaluating variable "word216": Unfinished modifier ('=' missing)
+# expect+1: Malformed conditional (${word216:L:from${:D=}to})
+.if ${word216:L:from${:D=}to}
. error
.endif
@@ -255,6 +256,7 @@ INDIRECT= 1:${VALUE} 2:$${VALUE} 4:$$$${
# The error case of an unfinished ':from=to' modifier after the '=' requires
# an expression that is missing the closing '}'.
+# expect+2: while evaluating variable "error": Unfinished modifier ('}' missing)
# expect+1: Malformed conditional (${error:L:from=$(}))
.if ${error:L:from=$(})
.endif
Index: src/usr.bin/make/unit-tests/varmod-edge.mk
diff -u src/usr.bin/make/unit-tests/varmod-edge.mk:1.20 src/usr.bin/make/unit-tests/varmod-edge.mk:1.21
--- src/usr.bin/make/unit-tests/varmod-edge.mk:1.20 Sat Apr 20 10:18:55 2024
+++ src/usr.bin/make/unit-tests/varmod-edge.mk Sun Jun 30 15:21:24 2024
@@ -1,4 +1,4 @@
-# $NetBSD: varmod-edge.mk,v 1.20 2024/04/20 10:18:55 rillig Exp $
+# $NetBSD: varmod-edge.mk,v 1.21 2024/06/30 15:21:24 rillig Exp $
#
# Tests for edge cases in variable modifiers.
#
@@ -162,6 +162,7 @@ MOD.colons= ${INP.colons::::}
EXP.colons= # empty
.for test in ${TESTS}
+# expect+3: while evaluating variable "MOD.eq-esc": while evaluating variable "INP.eq-esc": Unfinished modifier ('=' missing)
# expect+2: while evaluating variable "MOD.colons": while evaluating variable "INP.colons": Unknown modifier ":"
# expect+1: while evaluating variable "MOD.colons": while evaluating variable "INP.colons": Unknown modifier ":"
. if ${MOD.${test}} == ${EXP.${test}}
@@ -204,7 +205,7 @@ EXP.colons= # empty
# variable name with quotes, leading to the rather confusing "Unfinished
# modifier for (',' missing)", having two spaces in a row.
#
-# XXX: The error message should report the filename:lineno.
+# expect+2: while evaluating "${:S,}": Unfinished modifier (',' missing)
# expect+1: Malformed conditional (${:S,})
.if ${:S,}
. error
Index: src/usr.bin/make/unit-tests/varmod-sysv.exp
diff -u src/usr.bin/make/unit-tests/varmod-sysv.exp:1.11 src/usr.bin/make/unit-tests/varmod-sysv.exp:1.12
--- src/usr.bin/make/unit-tests/varmod-sysv.exp:1.11 Sat Jun 1 18:44:05 2024
+++ src/usr.bin/make/unit-tests/varmod-sysv.exp Sun Jun 30 15:21:24 2024
@@ -1,5 +1,5 @@
-make: Unfinished modifier for "word214" ('=' missing)
-make: "varmod-sysv.mk" line 215: Malformed conditional (${word214:L:from${:D=}to})
+make: "varmod-sysv.mk" line 216: while evaluating variable "word216": Unfinished modifier ('=' missing)
+make: "varmod-sysv.mk" line 216: Malformed conditional (${word216:L:from${:D=}to})
word modifier result
'' = ""
suffix = "suffix"
@@ -145,8 +145,8 @@ pre-middle-suffix pre%ffix=NPre%
suffix pre%ffix=NPre%NS "suffix"
prefix pre%ffix=NPre%NS "prefix"
pre-middle-suffix pre%ffix=NPre%NS "NPre-middle-suNS"
-make: Unfinished modifier for "error" ('}' missing)
-make: "varmod-sysv.mk" line 259: Malformed conditional (${error:L:from=$(}))
+make: "varmod-sysv.mk" line 261: while evaluating variable "error": Unfinished modifier ('}' missing)
+make: "varmod-sysv.mk" line 261: Malformed conditional (${error:L:from=$(}))
make: Fatal errors encountered -- cannot continue
make: stopped in unit-tests
exit status 1