Module Name:    src
Committed By:   rillig
Date:           Sat Mar 29 23:50:07 UTC 2025

Modified Files:
        src/usr.bin/make: var.c
        src/usr.bin/make/unit-tests: varmod-order.exp varmod-order.mk varmod.mk
            varparse-errors.exp varparse-errors.mk

Log Message:
make: let unknown ":O" modifiers fall back to the ":from=to" modifier

Inspired by https://bugs.freebsd.org/285726, which concerns the ":t"
modifier instead.

This means that future extensions to the ":O" modifier must not contain
a "=" anywhere, otherwise they may break existing code.


To generate a diff of this commit:
cvs rdiff -u -r1.1152 -r1.1153 src/usr.bin/make/var.c
cvs rdiff -u -r1.17 -r1.18 src/usr.bin/make/unit-tests/varmod-order.exp
cvs rdiff -u -r1.18 -r1.19 src/usr.bin/make/unit-tests/varmod-order.mk \
    src/usr.bin/make/unit-tests/varparse-errors.exp
cvs rdiff -u -r1.23 -r1.24 src/usr.bin/make/unit-tests/varmod.mk
cvs rdiff -u -r1.21 -r1.22 src/usr.bin/make/unit-tests/varparse-errors.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.1152 src/usr.bin/make/var.c:1.1153
--- src/usr.bin/make/var.c:1.1152	Sat Mar 29 21:30:47 2025
+++ src/usr.bin/make/var.c	Sat Mar 29 23:50:07 2025
@@ -1,4 +1,4 @@
-/*	$NetBSD: var.c,v 1.1152 2025/03/29 21:30:47 rillig Exp $	*/
+/*	$NetBSD: var.c,v 1.1153 2025/03/29 23:50:07 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.1152 2025/03/29 21:30:47 rillig Exp $");
+MAKE_RCSID("$NetBSD: var.c,v 1.1153 2025/03/29 23:50:07 rillig Exp $");
 
 /*
  * Variables are defined using one of the VAR=value assignments.  Their
@@ -3438,17 +3438,17 @@ ApplyModifier_Order(const char **pp, Mod
 		else if (mod[1] == 'x')
 			cmp = NULL;
 		else
-			goto bad;
+			return AMR_UNKNOWN;
 		*pp += 2;
 	} else if (IsDelimiter(mod[3], ch)) {
 		if ((mod[1] == 'n' && mod[2] == 'r') ||
 		    (mod[1] == 'r' && mod[2] == 'n'))
 			cmp = SubNumDesc;
 		else
-			goto bad;
+			return AMR_UNKNOWN;
 		*pp += 3;
 	} else
-		goto bad;
+		return AMR_UNKNOWN;
 
 	if (!ModChain_ShouldEval(ch))
 		return AMR_OK;
@@ -3463,10 +3463,6 @@ ApplyModifier_Order(const char **pp, Mod
 	Expr_SetValueOwn(ch->expr, SubstringWords_JoinFree(words));
 
 	return AMR_OK;
-
-bad:
-	(*pp)++;
-	return AMR_BAD;
 }
 
 /* :? then : else */

Index: src/usr.bin/make/unit-tests/varmod-order.exp
diff -u src/usr.bin/make/unit-tests/varmod-order.exp:1.17 src/usr.bin/make/unit-tests/varmod-order.exp:1.18
--- src/usr.bin/make/unit-tests/varmod-order.exp:1.17	Sat Jan 11 20:54:46 2025
+++ src/usr.bin/make/unit-tests/varmod-order.exp	Sat Mar 29 23:50:07 2025
@@ -1,6 +1,6 @@
-make: "varmod-order.mk" line 14: Bad modifier ":OX"
+make: "varmod-order.mk" line 14: Unknown modifier ":OX"
 	while evaluating variable "WORDS" with value "one two three four five six seven eight nine ten"
-make: "varmod-order.mk" line 17: Bad modifier ":OxXX"
+make: "varmod-order.mk" line 17: Unknown modifier ":OxXX"
 	while evaluating variable "WORDS" with value "one two three four five six seven eight nine ten"
 make: "varmod-order.mk" line 20: Unclosed expression, expecting '}' for modifier "O"
 	while evaluating variable "WORDS" with value "eight five four nine one seven six ten three two"
@@ -8,22 +8,20 @@ make: "varmod-order.mk" line 22: Unclose
 	while evaluating variable "NUMBERS" with value "1 2 3 4 5 6 7 8 9 10"
 make: "varmod-order.mk" line 24: Unclosed expression, expecting '}' for modifier "Onr"
 	while evaluating variable "NUMBERS" with value "10 9 8 7 6 5 4 3 2 1"
-make: "varmod-order.mk" line 30: Bad modifier ":Oxn"
+make: "varmod-order.mk" line 30: Unknown modifier ":Oxn"
 	while evaluating variable "NUMBERS" with value "8 5 4 9 1 7 6 10 3 2"
-make: "varmod-order.mk" line 39: Bad modifier ":On_typo"
+make: "varmod-order.mk" line 39: Unknown modifier ":On_typo"
 	while evaluating variable "NUMBERS" with value "8 5 4 9 1 7 6 10 3 2"
-make: "varmod-order.mk" line 48: Bad modifier ":Onr_typo"
+make: "varmod-order.mk" line 48: Unknown modifier ":Onr_typo"
 	while evaluating variable "NUMBERS" with value "8 5 4 9 1 7 6 10 3 2"
-make: "varmod-order.mk" line 57: Bad modifier ":Orn_typo"
+make: "varmod-order.mk" line 57: Unknown modifier ":Orn_typo"
 	while evaluating variable "NUMBERS" with value "8 5 4 9 1 7 6 10 3 2"
-make: "varmod-order.mk" line 68: Bad modifier ":Onn"
+make: "varmod-order.mk" line 68: Unknown modifier ":Onn"
 	while evaluating variable "NUMBERS" with value "8 5 4 9 1 7 6 10 3 2"
-make: "varmod-order.mk" line 77: Bad modifier ":Onrr"
+make: "varmod-order.mk" line 77: Unknown modifier ":Onrr"
 	while evaluating variable "NUMBERS" with value "8 5 4 9 1 7 6 10 3 2"
-make: "varmod-order.mk" line 86: Bad modifier ":Orrn"
+make: "varmod-order.mk" line 86: Unknown modifier ":Orrn"
 	while evaluating variable "NUMBERS" with value "8 5 4 9 1 7 6 10 3 2"
-make: "varmod-order.mk" line 100: Bad modifier ":On=Off"
-	while evaluating variable "SWITCH" with value "On"
 make: Fatal errors encountered -- cannot continue
 make: stopped making "all" in unit-tests
 exit status 1

Index: src/usr.bin/make/unit-tests/varmod-order.mk
diff -u src/usr.bin/make/unit-tests/varmod-order.mk:1.18 src/usr.bin/make/unit-tests/varmod-order.mk:1.19
--- src/usr.bin/make/unit-tests/varmod-order.mk:1.18	Sat Jan 11 20:54:46 2025
+++ src/usr.bin/make/unit-tests/varmod-order.mk	Sat Mar 29 23:50:07 2025
@@ -1,4 +1,4 @@
-# $NetBSD: varmod-order.mk,v 1.18 2025/01/11 20:54:46 rillig Exp $
+# $NetBSD: varmod-order.mk,v 1.19 2025/03/29 23:50:07 rillig Exp $
 #
 # Tests for the :O variable modifier and its variants, which either sort the
 # words of the value or shuffle them.
@@ -10,10 +10,10 @@ NUMBERS=	8 5 4 9 1 7 6 10 3 2	# in Engli
 .  error ${WORDS:O}
 .endif
 
-# expect+1: Bad modifier ":OX"
+# expect+1: Unknown modifier ":OX"
 _:=	${WORDS:OX}
 
-# expect+1: Bad modifier ":OxXX"
+# expect+1: Unknown modifier ":OxXX"
 _:=	${WORDS:OxXX}
 
 # expect+1: Unclosed expression, expecting '}' for modifier "O"
@@ -26,7 +26,7 @@ _:=	${NUMBERS:Onr
 # Shuffling numerically doesn't make sense, so don't allow 'x' and 'n' to be
 # combined.
 #
-# expect+1: Bad modifier ":Oxn"
+# expect+1: Unknown modifier ":Oxn"
 .if ${NUMBERS:Oxn}
 .  error
 .else
@@ -35,7 +35,7 @@ _:=	${NUMBERS:Onr
 
 # Extra characters after ':On' are detected and diagnosed.
 #
-# expect+1: Bad modifier ":On_typo"
+# expect+1: Unknown modifier ":On_typo"
 .if ${NUMBERS:On_typo}
 .  error
 .else
@@ -44,7 +44,7 @@ _:=	${NUMBERS:Onr
 
 # Extra characters after ':Onr' are detected and diagnosed.
 #
-# expect+1: Bad modifier ":Onr_typo"
+# expect+1: Unknown modifier ":Onr_typo"
 .if ${NUMBERS:Onr_typo}
 .  error
 .else
@@ -53,7 +53,7 @@ _:=	${NUMBERS:Onr
 
 # Extra characters after ':Orn' are detected and diagnosed.
 #
-# expect+1: Bad modifier ":Orn_typo"
+# expect+1: Unknown modifier ":Orn_typo"
 .if ${NUMBERS:Orn_typo}
 .  error
 .else
@@ -64,7 +64,7 @@ _:=	${NUMBERS:Onr
 # criteria are fixed, not computed, therefore allowing this redundancy does
 # not make sense.
 #
-# expect+1: Bad modifier ":Onn"
+# expect+1: Unknown modifier ":Onn"
 .if ${NUMBERS:Onn}
 .  error
 .else
@@ -73,7 +73,7 @@ _:=	${NUMBERS:Onr
 
 # Repeating the 'r' is not supported as well, for the same reasons as above.
 #
-# expect+1: Bad modifier ":Onrr"
+# expect+1: Unknown modifier ":Onrr"
 .if ${NUMBERS:Onrr}
 .  error
 .else
@@ -82,7 +82,7 @@ _:=	${NUMBERS:Onr
 
 # Repeating the 'r' is not supported as well, for the same reasons as above.
 #
-# expect+1: Bad modifier ":Orrn"
+# expect+1: Unknown modifier ":Orrn"
 .if ${NUMBERS:Orrn}
 .  error
 .else
@@ -91,16 +91,10 @@ _:=	${NUMBERS:Onr
 
 
 # If a modifier that starts with ':O' is not one of the known sort or shuffle
-# forms, it is a parse error.  Several other modifiers such as ':H' or ':u'
-# fall back to the SysV modifier, for example, ':H=new' is not the standard
-# ':H' modifier but instead replaces a trailing 'H' with 'new' in each word.
-# There is no such fallback for the ':O' modifiers.
+# forms, fall back to the SysV modifier.
 SWITCH=	On
-# expect+1: Bad modifier ":On=Off"
 .if ${SWITCH:On=Off} != "Off"
 .  error
-.else
-.  error
 .endif
 
 all:
Index: src/usr.bin/make/unit-tests/varparse-errors.exp
diff -u src/usr.bin/make/unit-tests/varparse-errors.exp:1.18 src/usr.bin/make/unit-tests/varparse-errors.exp:1.19
--- src/usr.bin/make/unit-tests/varparse-errors.exp:1.18	Sat Mar 29 21:30:47 2025
+++ src/usr.bin/make/unit-tests/varparse-errors.exp	Sat Mar 29 23:50:07 2025
@@ -2,14 +2,14 @@ make: "varparse-errors.mk" line 38: Unkn
 	while evaluating "${:U:Z}" with value ""
 make: "varparse-errors.mk" line 47: Unknown modifier ":Z"
 	while evaluating "${:U:Z}post" with value ""
-make: "varparse-errors.mk" line 73: Bad modifier ":OX"
+make: "varparse-errors.mk" line 73: Unknown modifier ":OX"
 	while evaluating "${:U:OX:U${IND}} ${:U:OX:U${IND}}" with value ""
-make: "varparse-errors.mk" line 73: Bad modifier ":OX"
+make: "varparse-errors.mk" line 73: Unknown modifier ":OX"
 	while evaluating "${:OX}" with value ""
 	while evaluating variable "IND" with value "${:OX}"
-make: "varparse-errors.mk" line 73: Bad modifier ":OX"
+make: "varparse-errors.mk" line 73: Unknown modifier ":OX"
 	while evaluating "${:U:OX:U${IND}}" with value ""
-make: "varparse-errors.mk" line 73: Bad modifier ":OX"
+make: "varparse-errors.mk" line 73: Unknown modifier ":OX"
 	while evaluating "${:OX}" with value ""
 	while evaluating variable "IND" with value "${:OX}"
 make: "varparse-errors.mk" line 81: Unclosed expression, expecting '}' for modifier "Q"

Index: src/usr.bin/make/unit-tests/varmod.mk
diff -u src/usr.bin/make/unit-tests/varmod.mk:1.23 src/usr.bin/make/unit-tests/varmod.mk:1.24
--- src/usr.bin/make/unit-tests/varmod.mk:1.23	Sat Mar 29 20:19:58 2025
+++ src/usr.bin/make/unit-tests/varmod.mk	Sat Mar 29 23:50:07 2025
@@ -1,4 +1,4 @@
-# $NetBSD: varmod.mk,v 1.23 2025/03/29 20:19:58 rillig Exp $
+# $NetBSD: varmod.mk,v 1.24 2025/03/29 23:50:07 rillig Exp $
 #
 # Tests for variable modifiers, such as :Q, :S,from,to or :Ufallback.
 #
@@ -47,7 +47,7 @@
 # | L            | no-colon     |                    | no       |
 # | M            | individual   | custom parser      | no       |
 # | N            | individual   | custom parser      | no       |
-# | O            | strict       | only literal value | no       |
+# | O            | strict       | only literal value | yes      |
 # | P            | no-colon     |                    | no       |
 # | Q            | strict       |                    | yes      |
 # | R            | strict       |                    | yes      |

Index: src/usr.bin/make/unit-tests/varparse-errors.mk
diff -u src/usr.bin/make/unit-tests/varparse-errors.mk:1.21 src/usr.bin/make/unit-tests/varparse-errors.mk:1.22
--- src/usr.bin/make/unit-tests/varparse-errors.mk:1.21	Sat Mar 29 21:30:48 2025
+++ src/usr.bin/make/unit-tests/varparse-errors.mk	Sat Mar 29 23:50:07 2025
@@ -1,4 +1,4 @@
-# $NetBSD: varparse-errors.mk,v 1.21 2025/03/29 21:30:48 rillig Exp $
+# $NetBSD: varparse-errors.mk,v 1.22 2025/03/29 23:50:07 rillig Exp $
 
 # Tests for parsing and evaluating all kinds of expressions.
 #
@@ -66,10 +66,10 @@ VAR.${:U:Z}post=	unknown modifier with t
 #
 #.MAKEFLAGS: -dv
 IND=	${:OX}
-# expect+4: Bad modifier ":OX"
-# expect+3: Bad modifier ":OX"
-# expect+2: Bad modifier ":OX"
-# expect+1: Bad modifier ":OX"
+# expect+4: Unknown modifier ":OX"
+# expect+3: Unknown modifier ":OX"
+# expect+2: Unknown modifier ":OX"
+# expect+1: Unknown modifier ":OX"
 _:=	${:U:OX:U${IND}} ${:U:OX:U${IND}}
 #.MAKEFLAGS: -d0
 

Reply via email to