Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/usr.bin/make/unit-tests tests/make: move and extend test for...
details: https://anonhg.NetBSD.org/src/rev/a805d1fd8dc8
branches: trunk
changeset: 984080:a805d1fd8dc8
user: rillig <rillig%NetBSD.org@localhost>
date: Mon Jun 21 08:17:39 2021 +0000
description:
tests/make: move and extend test for unmatched '\1' in ':C'
This test lived together with a few unrelated tests in moderrs.mk, it is
better placed in varmod-subst-regex.mk though.
While here, extend, document and explain the test since its purpose was
not obvious from reading the code alone.
diffstat:
usr.bin/make/unit-tests/moderrs.exp | 9 ----
usr.bin/make/unit-tests/moderrs.mk | 20 +---------
usr.bin/make/unit-tests/varmod-subst-regex.exp | 23 ++++++++++-
usr.bin/make/unit-tests/varmod-subst-regex.mk | 54 +++++++++++++++++++++++++-
4 files changed, 76 insertions(+), 30 deletions(-)
diffs (161 lines):
diff -r b94eb3c144df -r a805d1fd8dc8 usr.bin/make/unit-tests/moderrs.exp
--- a/usr.bin/make/unit-tests/moderrs.exp Mon Jun 21 06:36:28 2021 +0000
+++ b/usr.bin/make/unit-tests/moderrs.exp Mon Jun 21 08:17:39 2021 +0000
@@ -86,15 +86,6 @@
6: TheVariable
7: TheVariable
-mod-regex-undefined-subexpression:
-one one 2 3 5 8 one3 2one 34
-make: No match for subexpression \2
-make: No match for subexpression \2
-make: No match for subexpression \1
-make: No match for subexpression \2
-make: No match for subexpression \1
-()+() ()+() ()+() 3 5 8 (3)+() ()+(1) 34
-
mod-ts-parse:
112358132134
15152535558513521534
diff -r b94eb3c144df -r a805d1fd8dc8 usr.bin/make/unit-tests/moderrs.mk
--- a/usr.bin/make/unit-tests/moderrs.mk Mon Jun 21 06:36:28 2021 +0000
+++ b/usr.bin/make/unit-tests/moderrs.mk Mon Jun 21 08:17:39 2021 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: moderrs.mk,v 1.28 2021/06/21 04:24:17 sjg Exp $
+# $NetBSD: moderrs.mk,v 1.29 2021/06/21 08:17:39 rillig Exp $
#
# various modifier error tests
@@ -22,7 +22,6 @@
all: exclam
all: mod-subst-delimiter
all: mod-regex-delimiter
-all: mod-regex-undefined-subexpression
all: mod-ts-parse
all: mod-t-parse
all: mod-ifelse-parse
@@ -122,23 +121,6 @@
@echo 6: ${VAR:C,from,to,
@echo 7: ${VAR:C,from,to,}
-# In regular expressions with alternatives, not all capturing groups are
-# always set; some may be missing. Warn about these.
-#
-# Since there is no way to turn off this warning, the combination of
-# alternative matches and capturing groups is seldom used, if at all.
-#
-# A newly added modifier 'U' such as in :C,(a.)|(b.),\1\2,U might be added
-# for treating undefined capturing groups as empty, but that would create a
-# syntactical ambiguity since the :S and :C modifiers are open-ended (see
-# mod-subst-chain). Luckily the modifier :U does not make sense after :C,
-# therefore this case does not happen in practice.
-# The sub-modifier for the :S and :C modifiers would have to be chosen
-# wisely, to not create ambiguities while parsing.
-mod-regex-undefined-subexpression: print-header print-footer
- @echo ${FIB:C,1(.*),one\1,} # all ok
- @echo ${FIB:C,1(.*)|2(.*),(\1)+(\2),:Q} # no match for subexpression
-
mod-ts-parse: print-header print-footer
@echo ${FIB:ts}
@echo ${FIB:ts\65} # octal 065 == U+0035 == '5'
diff -r b94eb3c144df -r a805d1fd8dc8 usr.bin/make/unit-tests/varmod-subst-regex.exp
--- a/usr.bin/make/unit-tests/varmod-subst-regex.exp Mon Jun 21 06:36:28 2021 +0000
+++ b/usr.bin/make/unit-tests/varmod-subst-regex.exp Mon Jun 21 08:17:39 2021 +0000
@@ -22,4 +22,25 @@
mod-regex-errors:
make: Unknown modifier "Z"
mod-regex-errors: xy
-exit status 0
+unmatched-subexpression.ok: one one 2 3 5 8 one3 2one 34
+make: No match for subexpression \2
+unmatched-subexpression.1: ()()
+make: No match for subexpression \2
+unmatched-subexpression.1: ()()
+make: No match for subexpression \1
+unmatched-subexpression.2: ()()
+unmatched-subexpression.3: 3
+unmatched-subexpression.5: 5
+unmatched-subexpression.8: 8
+make: No match for subexpression \2
+unmatched-subexpression.13: (3)()
+make: No match for subexpression \1
+unmatched-subexpression.21: ()(1)
+unmatched-subexpression.34: 34
+make: No match for subexpression \2
+make: No match for subexpression \2
+make: No match for subexpression \1
+make: No match for subexpression \2
+make: No match for subexpression \1
+unmatched-subexpression.all: ()() ()() ()() 3 5 8 (3)() ()(1) 34
+exit status 2
diff -r b94eb3c144df -r a805d1fd8dc8 usr.bin/make/unit-tests/varmod-subst-regex.mk
--- a/usr.bin/make/unit-tests/varmod-subst-regex.mk Mon Jun 21 06:36:28 2021 +0000
+++ b/usr.bin/make/unit-tests/varmod-subst-regex.mk Mon Jun 21 08:17:39 2021 +0000
@@ -1,10 +1,14 @@
-# $NetBSD: varmod-subst-regex.mk,v 1.6 2020/12/05 18:13:44 rillig Exp $
+# $NetBSD: varmod-subst-regex.mk,v 1.7 2021/06/21 08:17:39 rillig Exp $
#
# Tests for the :C,from,to, variable modifier.
+# report unmatched subexpressions
+.MAKEFLAGS: -dL
+
all: mod-regex-compile-error
all: mod-regex-limits
all: mod-regex-errors
+all: unmatched-subexpression
# The variable expression expands to 4 words. Of these words, none matches
# the regular expression "a b" since these words don't contain any
@@ -107,3 +111,51 @@
# unknown modifier, the parse error is ignored in ParseModifierPart
# and the faulty variable expression expands to "".
@echo $@: ${word:L:C,.*,x${:U:Z}y,W}
+
+# In regular expressions with alternatives, not all capturing groups are
+# always set; some may be missing. Make calls these "unmatched
+# subexpressions".
+#
+# Between var.c 1.16 from 1996-12-24 until before var.c 1.933 from 2021-06-21,
+# unmatched subexpressions produced an "error message" but did not have any
+# further effect since the "error handling" didn't influence the exit status.
+#
+# Before 2021-06-21 there was no way to turn off this warning, thus the
+# combination of alternative matches and capturing groups was seldom used, if
+# at all.
+#
+# Since var.c 1.933 from 2021-06-21, the error message is only printed in lint
+# mode (-dL), but not in default mode.
+#
+# As an alternative to the change from var.c 1.933 from 2021-06-21, a possible
+# mitigation would have been to add a new modifier 'U' to the already existing
+# '1Wg' modifiers of the ':C' modifier. That modifier could have been used in
+# the modifier ':C,(a.)|(b.),\1\2,U' to treat unmatched subexpressions as
+# empty. This approach would have created a syntactical ambiguity since the
+# modifiers ':S' and ':C' are open-ended (see mod-subst-chain), that is, they
+# do not need to be followed by a ':' to separate them from the next modifier.
+# Luckily the modifier :U does not make sense after :C, therefore this case
+# does not happen in practice.
+unmatched-subexpression:
+ # In each of the following cases, if the regular expression matches at
+ # all, the subexpression \1 matches as well.
+ @echo $@.ok: ${:U1 1 2 3 5 8 13 21 34:C,1(.*),one\1,}
+
+ # In the following cases:
+ # * The subexpression \1 is only defined for 1 and 13.
+ # * The subexpression \2 is only defined for 2 and 21.
+ # * If the regular expression does not match at all, the
+ # replacement string is not analyzed, thus no error messages.
+ # In total, there are 5 error messages about unmatched subexpressions.
+ @echo $@.1: ${:U 1:C,1(.*)|2(.*),(\1)(\2),:Q} # missing \2
+ @echo $@.1: ${:U 1:C,1(.*)|2(.*),(\1)(\2),:Q} # missing \2
+ @echo $@.2: ${:U 2:C,1(.*)|2(.*),(\1)(\2),:Q} # missing \1
+ @echo $@.3: ${:U 3:C,1(.*)|2(.*),(\1)(\2),:Q}
+ @echo $@.5: ${:U 5:C,1(.*)|2(.*),(\1)(\2),:Q}
+ @echo $@.8: ${:U 8:C,1(.*)|2(.*),(\1)(\2),:Q}
+ @echo $@.13: ${:U 13:C,1(.*)|2(.*),(\1)(\2),:Q} # missing \2
+ @echo $@.21: ${:U 21:C,1(.*)|2(.*),(\1)(\2),:Q} # missing \1
+ @echo $@.34: ${:U 34:C,1(.*)|2(.*),(\1)(\2),:Q}
+
+ # And now all together: 5 error messages for 1, 1, 2, 13, 21.
+ @echo $@.all: ${:U1 1 2 3 5 8 13 21 34:C,1(.*)|2(.*),(\1)(\2),:Q}
Home |
Main Index |
Thread Index |
Old Index