Module Name: src
Committed By: rillig
Date: Sat Mar 29 16:44:14 UTC 2025
Modified Files:
src/usr.bin/make: var.c
src/usr.bin/make/unit-tests: moderrs.exp moderrs.mk vardebug.exp
vardebug.mk varmod-edge.exp varmod-edge.mk varmod-indirect.exp
varmod-indirect.mk
Log Message:
make: stop parsing after seeing an unknown modifier in an expression
Previously, after an expression such as ${VAR:Z::::}, make detected the
unknown modifier ":Z" and then continued parsing, which produced
unnecessary follow-up error messages. It was also necessary to
distinguish the error cases when logging the result of an applied
modifier in -dv mode.
Unify the error handling cases of a syntax error, an evaluation error
and an unknown modifier, to avoid the unnecessary follow-up error
messages.
The test in varmod-edge.mk now produces ":}" from the erroneous
expression, which may be misleading and thus will be looked at in a
follow-up commit.
The general idea of this patch was reviewed by sjg, I made a few
nonsubstantial changes after the review.
To generate a diff of this commit:
cvs rdiff -u -r1.1149 -r1.1150 src/usr.bin/make/var.c
cvs rdiff -u -r1.49 -r1.50 src/usr.bin/make/unit-tests/moderrs.exp
cvs rdiff -u -r1.43 -r1.44 src/usr.bin/make/unit-tests/moderrs.mk
cvs rdiff -u -r1.40 -r1.41 src/usr.bin/make/unit-tests/vardebug.exp
cvs rdiff -u -r1.16 -r1.17 src/usr.bin/make/unit-tests/vardebug.mk
cvs rdiff -u -r1.30 -r1.31 src/usr.bin/make/unit-tests/varmod-edge.exp
cvs rdiff -u -r1.34 -r1.35 src/usr.bin/make/unit-tests/varmod-edge.mk
cvs rdiff -u -r1.32 -r1.33 src/usr.bin/make/unit-tests/varmod-indirect.exp
cvs rdiff -u -r1.21 -r1.22 src/usr.bin/make/unit-tests/varmod-indirect.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/var.c
diff -u src/usr.bin/make/var.c:1.1149 src/usr.bin/make/var.c:1.1150
--- src/usr.bin/make/var.c:1.1149 Sat Mar 29 12:02:40 2025
+++ src/usr.bin/make/var.c Sat Mar 29 16:44:14 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: var.c,v 1.1149 2025/03/29 12:02:40 rillig Exp $ */
+/* $NetBSD: var.c,v 1.1150 2025/03/29 16:44:14 rillig Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1993
@@ -128,7 +128,7 @@
#include "metachar.h"
/* "@(#)var.c 8.3 (Berkeley) 3/19/94" */
-MAKE_RCSID("$NetBSD: var.c,v 1.1149 2025/03/29 12:02:40 rillig Exp $");
+MAKE_RCSID("$NetBSD: var.c,v 1.1150 2025/03/29 16:44:14 rillig Exp $");
/*
* Variables are defined using one of the VAR=value assignments. Their
@@ -3843,18 +3843,15 @@ LogAfterApply(const ModChain *ch, const
{
const Expr *expr = ch->expr;
const char *value = Expr_Str(expr);
- const char *quot = value == var_Error ? "" : "\"";
if (ShouldLogInSimpleFormat(expr)) {
- debug_printf("Result of ${%s:%.*s} is %s%s%s\n",
- expr->name, (int)(p - mod), mod,
- quot, value == var_Error ? "error" : value, quot);
+ debug_printf("Result of ${%s:%.*s} is \"%s\"\n",
+ expr->name, (int)(p - mod), mod, value);
return;
}
- debug_printf("Result of ${%s:%.*s} is %s%s%s (%s, %s)\n",
- expr->name, (int)(p - mod), mod,
- quot, value == var_Error ? "error" : value, quot,
+ debug_printf("Result of ${%s:%.*s} is \"%s\" (%s, %s)\n",
+ expr->name, (int)(p - mod), mod, value,
VarEvalMode_Name[expr->emode],
ExprDefined_Name[expr->defined]);
}
@@ -4019,8 +4016,9 @@ ApplySingleModifier(const char **pp, Mod
Parse_Error(PARSE_FATAL, "Unknown modifier \"%.*s\"",
(int)(p - mod), mod);
Expr_SetValueRefer(ch->expr, var_Error);
+ res = AMR_CLEANUP;
}
- if (res == AMR_CLEANUP || res == AMR_BAD) {
+ if (res != AMR_OK) {
*pp = p;
return res;
}
Index: src/usr.bin/make/unit-tests/moderrs.exp
diff -u src/usr.bin/make/unit-tests/moderrs.exp:1.49 src/usr.bin/make/unit-tests/moderrs.exp:1.50
--- src/usr.bin/make/unit-tests/moderrs.exp:1.49 Sat Mar 29 12:02:41 2025
+++ src/usr.bin/make/unit-tests/moderrs.exp Sat Mar 29 16:44:14 2025
@@ -161,10 +161,6 @@ make: Unknown modifier "3"
while evaluating variable "FIB" with value "1 1 2 3 5 8 13 21 34"
in command "@echo ${FIB:3"
in target "mod-sysv-parse-1"
-make: Unclosed expression, expecting '}' for modifier "3"
- while evaluating variable "FIB" with value ""
- in command "@echo ${FIB:3"
- in target "mod-sysv-parse-1"
make: Unfinished modifier after "", expecting "}"
while evaluating variable "FIB" with value "1 1 2 3 5 8 13 21 34"
in command "@echo ${FIB:3="
Index: src/usr.bin/make/unit-tests/moderrs.mk
diff -u src/usr.bin/make/unit-tests/moderrs.mk:1.43 src/usr.bin/make/unit-tests/moderrs.mk:1.44
--- src/usr.bin/make/unit-tests/moderrs.mk:1.43 Sat Mar 29 12:02:41 2025
+++ src/usr.bin/make/unit-tests/moderrs.mk Sat Mar 29 16:44:14 2025
@@ -1,4 +1,4 @@
-# $NetBSD: moderrs.mk,v 1.43 2025/03/29 12:02:41 rillig Exp $
+# $NetBSD: moderrs.mk,v 1.44 2025/03/29 16:44:14 rillig Exp $
#
# various modifier error tests
@@ -197,7 +197,6 @@ mod-remember-parse:
mod-sysv-parse-1:
# expect: make: Unknown modifier "3"
-# expect: make: Unclosed expression, expecting '}' for modifier "3"
@echo ${FIB:3
mod-sysv-parse-2:
# expect: make: Unfinished modifier after "", expecting "}"
Index: src/usr.bin/make/unit-tests/vardebug.exp
diff -u src/usr.bin/make/unit-tests/vardebug.exp:1.40 src/usr.bin/make/unit-tests/vardebug.exp:1.41
--- src/usr.bin/make/unit-tests/vardebug.exp:1.40 Sat Jan 11 21:21:33 2025
+++ src/usr.bin/make/unit-tests/vardebug.exp Sat Mar 29 16:44:14 2025
@@ -54,11 +54,10 @@ Var_Parse: ${:Uvariable:unknown} (eval-d
Evaluating modifier ${:U...} on value "" (eval, undefined)
Result of ${:Uvariable} is "variable" (eval, defined)
Evaluating modifier ${:u...} on value "variable" (eval, defined)
-make: "vardebug.mk" line 62: Unknown modifier "unknown"
+make: "vardebug.mk" line 59: Unknown modifier "unknown"
while evaluating "${:Uvariable:unknown}" with value "variable"
-Result of ${:unknown} is error (eval, defined)
Var_Parse: ${UNDEFINED} (eval-defined-loud)
-make: "vardebug.mk" line 66: Variable "UNDEFINED" is undefined
+make: "vardebug.mk" line 63: Variable "UNDEFINED" is undefined
Global: ignoring delete '.SHELL' as it is not found
Command: .SHELL = </path/to/shell>
Command: ignoring '.SHELL = overwritten' as it is read-only
Index: src/usr.bin/make/unit-tests/vardebug.mk
diff -u src/usr.bin/make/unit-tests/vardebug.mk:1.16 src/usr.bin/make/unit-tests/vardebug.mk:1.17
--- src/usr.bin/make/unit-tests/vardebug.mk:1.16 Sat Jan 11 21:21:33 2025
+++ src/usr.bin/make/unit-tests/vardebug.mk Sat Mar 29 16:44:14 2025
@@ -1,4 +1,4 @@
-# $NetBSD: vardebug.mk,v 1.16 2025/01/11 21:21:33 rillig Exp $
+# $NetBSD: vardebug.mk,v 1.17 2025/03/29 16:44:14 rillig Exp $
#
# Demonstrates the debugging output for var.c.
@@ -55,9 +55,6 @@ VAR+= 3
# expect: Global: delete VAR
.undef ${:UVAR} # Var_Delete
-# When ApplyModifiers results in an error, this appears in the debug log
-# as "is error", without surrounding quotes.
-# expect: Result of ${:unknown} is error (eval, defined)
# expect+1: Unknown modifier "unknown"
.if ${:Uvariable:unknown}
.endif
Index: src/usr.bin/make/unit-tests/varmod-edge.exp
diff -u src/usr.bin/make/unit-tests/varmod-edge.exp:1.30 src/usr.bin/make/unit-tests/varmod-edge.exp:1.31
--- src/usr.bin/make/unit-tests/varmod-edge.exp:1.30 Sat Mar 29 11:51:54 2025
+++ src/usr.bin/make/unit-tests/varmod-edge.exp Sat Mar 29 16:44:14 2025
@@ -8,15 +8,12 @@ make: "varmod-edge.mk" line 88: Unfinish
make: "varmod-edge.mk" line 178: Unfinished modifier after "a\=b}", expecting "="
while evaluating variable "INP" with value "file.c file..."
while evaluating variable "MOD" with value "${INP:a\=b}"
-make: "varmod-edge.mk" line 194: Unknown modifier ":"
+make: "varmod-edge.mk" line 193: Unknown modifier ":"
while evaluating variable "INP" with value "value"
while evaluating variable "MOD" with value "${INP::::}"
-make: "varmod-edge.mk" line 194: Unknown modifier ":"
- while evaluating variable "INP" with value ""
- while evaluating variable "MOD" with value "${INP::::}"
-make: "varmod-edge.mk" line 200: Unknown modifier "Z"
+make: "varmod-edge.mk" line 199: Unknown modifier "Z"
while evaluating "${:Z}" with value ""
-make: "varmod-edge.mk" line 213: Unfinished modifier after "}", expecting ","
+make: "varmod-edge.mk" line 212: Unfinished modifier after "}", expecting ","
while evaluating "${:S,}" with value ""
make: Fatal errors encountered -- cannot continue
make: stopped in unit-tests
Index: src/usr.bin/make/unit-tests/varmod-edge.mk
diff -u src/usr.bin/make/unit-tests/varmod-edge.mk:1.34 src/usr.bin/make/unit-tests/varmod-edge.mk:1.35
--- src/usr.bin/make/unit-tests/varmod-edge.mk:1.34 Sat Mar 29 11:51:54 2025
+++ src/usr.bin/make/unit-tests/varmod-edge.mk Sat Mar 29 16:44:14 2025
@@ -1,4 +1,4 @@
-# $NetBSD: varmod-edge.mk,v 1.34 2025/03/29 11:51:54 rillig Exp $
+# $NetBSD: varmod-edge.mk,v 1.35 2025/03/29 16:44:14 rillig Exp $
#
# Tests for edge cases in variable modifiers.
#
@@ -188,8 +188,7 @@ EXP= value
INP= value
MOD= ${INP::::}
-EXP= # empty
-# expect+2: Unknown modifier ":"
+EXP= :}
# expect+1: Unknown modifier ":"
.if ${MOD} != ${EXP}
. warning expected "${EXP}", got "${MOD}"
Index: src/usr.bin/make/unit-tests/varmod-indirect.exp
diff -u src/usr.bin/make/unit-tests/varmod-indirect.exp:1.32 src/usr.bin/make/unit-tests/varmod-indirect.exp:1.33
--- src/usr.bin/make/unit-tests/varmod-indirect.exp:1.32 Sat Mar 29 11:24:34 2025
+++ src/usr.bin/make/unit-tests/varmod-indirect.exp Sat Mar 29 16:44:14 2025
@@ -2,23 +2,22 @@ make: "varmod-indirect.mk" line 19: Unkn
while evaluating variable "value" with value "value"
make: "varmod-indirect.mk" line 52: Unknown modifier "${"
while evaluating variable "value" with value "value"
-make: "varmod-indirect.mk" line 54: warning: FIXME: this expression should have resulted in a parse error rather than returning the unparsed portion of the expression.
-make: "varmod-indirect.mk" line 143: before
-make: "varmod-indirect.mk" line 143: after
-make: "varmod-indirect.mk" line 151: before
-make: "varmod-indirect.mk" line 151: after
-make: "varmod-indirect.mk" line 159: before
-make: "varmod-indirect.mk" line 159: after
-make: "varmod-indirect.mk" line 164: Unknown modifier "Z"
+make: "varmod-indirect.mk" line 140: before
+make: "varmod-indirect.mk" line 140: after
+make: "varmod-indirect.mk" line 148: before
+make: "varmod-indirect.mk" line 148: after
+make: "varmod-indirect.mk" line 156: before
+make: "varmod-indirect.mk" line 156: after
+make: "varmod-indirect.mk" line 161: Unknown modifier "Z"
while evaluating indirect modifiers "Z"
while evaluating variable "UNDEF" with value ""
-make: "varmod-indirect.mk" line 167: before
-make: "varmod-indirect.mk" line 167: after
-Parsing varmod-indirect.mk:176: _:= before ${UNDEF} after
+make: "varmod-indirect.mk" line 164: before
+make: "varmod-indirect.mk" line 164: after
+Parsing varmod-indirect.mk:173: _:= before ${UNDEF} after
Global: _ = # (empty)
Var_Parse: ${UNDEF} after (eval-keep-dollar-and-undefined)
Global: _ = before ${UNDEF} after
-Parsing varmod-indirect.mk:179: _:= before ${UNDEF:${:US,a,a,}} after
+Parsing varmod-indirect.mk:176: _:= before ${UNDEF:${:US,a,a,}} after
Var_Parse: ${UNDEF:${:US,a,a,}} after (eval-keep-dollar-and-undefined)
Indirect modifier "S,a,a," from "${:US,a,a,}"
Evaluating modifier ${UNDEF:S...} on value "" (eval-keep-dollar-and-undefined, undefined)
@@ -27,20 +26,19 @@ Modifier part: "a"
ModifyWords: split "" into 1 word
Result of ${UNDEF:S,a,a,} is "" (eval-keep-dollar-and-undefined, undefined)
Global: _ = before ${UNDEF:S,a,a,} after
-Parsing varmod-indirect.mk:189: _:= before ${UNDEF:${:U}} after
+Parsing varmod-indirect.mk:186: _:= before ${UNDEF:${:U}} after
Var_Parse: ${UNDEF:${:U}} after (eval-keep-dollar-and-undefined)
Indirect modifier "" from "${:U}"
Global: _ = before ${UNDEF:} after
-Parsing varmod-indirect.mk:195: _:= before ${UNDEF:${:UZ}} after
+Parsing varmod-indirect.mk:192: _:= before ${UNDEF:${:UZ}} after
Var_Parse: ${UNDEF:${:UZ}} after (eval-keep-dollar-and-undefined)
Indirect modifier "Z" from "${:UZ}"
Evaluating modifier ${UNDEF:Z} on value "" (eval-keep-dollar-and-undefined, undefined)
-make: "varmod-indirect.mk" line 195: Unknown modifier "Z"
+make: "varmod-indirect.mk" line 192: Unknown modifier "Z"
while evaluating indirect modifiers "Z"
while evaluating variable "UNDEF" with value ""
-Result of ${UNDEF:Z} is error (eval-keep-dollar-and-undefined, undefined)
Global: _ = before ${UNDEF:Z} after
-Parsing varmod-indirect.mk:197: .MAKEFLAGS: -d0
+Parsing varmod-indirect.mk:194: .MAKEFLAGS: -d0
ParseDependency(.MAKEFLAGS: -d0)
Global: .MAKEFLAGS = -r -k -d 0 -d pv -d
Global: .MAKEFLAGS = -r -k -d 0 -d pv -d 0
Index: src/usr.bin/make/unit-tests/varmod-indirect.mk
diff -u src/usr.bin/make/unit-tests/varmod-indirect.mk:1.21 src/usr.bin/make/unit-tests/varmod-indirect.mk:1.22
--- src/usr.bin/make/unit-tests/varmod-indirect.mk:1.21 Thu Aug 29 20:20:36 2024
+++ src/usr.bin/make/unit-tests/varmod-indirect.mk Sat Mar 29 16:44:14 2025
@@ -1,4 +1,4 @@
-# $NetBSD: varmod-indirect.mk,v 1.21 2024/08/29 20:20:36 rillig Exp $
+# $NetBSD: varmod-indirect.mk,v 1.22 2025/03/29 16:44:14 rillig Exp $
#
# Tests for indirect variable modifiers, such as in ${VAR:${M_modifiers}}.
# These can be used for very basic purposes like converting a string to either
@@ -44,16 +44,13 @@
# If an expression for an indirect modifier evaluates to anything else than an
# empty string and is neither followed by a ':' nor '}', this produces a parse
-# error. Because of this parse error, this feature cannot be used reasonably
+# error. Due to this parse error, this construct cannot be used reasonably
# in practice.
#
# expect+2: Unknown modifier "${"
#.MAKEFLAGS: -dvc
-.if ${value:L:${:UM*}S,value,replaced,} == "M*S,value,replaced,}"
-# expect+1: warning: FIXME: this expression should have resulted in a parse error rather than returning the unparsed portion of the expression.
-. warning FIXME: this expression should have resulted in a parse $\
- error rather than returning the unparsed portion of the $\
- expression.
+.if ${value:L:${:UM*}S,value,replaced,} == "anything"
+. error
.else
. error
.endif