Module Name: src Committed By: rillig Date: Thu Jun 22 20:36:24 UTC 2023
Modified Files: src/usr.bin/make/unit-tests: varmod-match-escape.mk Log Message: tests/make: demonstrate inconsistency in pattern matching with ranges To generate a diff of this commit: cvs rdiff -u -r1.8 -r1.9 src/usr.bin/make/unit-tests/varmod-match-escape.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-match-escape.mk diff -u src/usr.bin/make/unit-tests/varmod-match-escape.mk:1.8 src/usr.bin/make/unit-tests/varmod-match-escape.mk:1.9 --- src/usr.bin/make/unit-tests/varmod-match-escape.mk:1.8 Thu Jun 1 20:56:35 2023 +++ src/usr.bin/make/unit-tests/varmod-match-escape.mk Thu Jun 22 20:36:24 2023 @@ -1,4 +1,4 @@ -# $NetBSD: varmod-match-escape.mk,v 1.8 2023/06/01 20:56:35 rillig Exp $ +# $NetBSD: varmod-match-escape.mk,v 1.9 2023/06/22 20:36:24 rillig Exp $ # # As of 2020-08-01, the :M and :N modifiers interpret backslashes differently, # depending on whether there was a variable expression somewhere before the @@ -77,12 +77,39 @@ VALUES= : :: :\: # # TODO: Str_Match("a-z]", "[a-z]") # TODO: Str_Match("012", "[0-]]") -# TODO: Str_Match("0]", "[0-]]") -# TODO: Str_Match("1]", "[0-]]") # TODO: Str_Match("[", "[[]") # TODO: Str_Match("]", "[]") # TODO: Str_Match("]", "[[-]]") +# Demonstrate an inconsistency between positive and negative character lists +# when the range ends with the character ']'. +# +# 'A' begins the range, 'B' is in the middle of the range, ']' ends the range, +# 'a' is outside the range. +WORDS= A A] A]] B B] B]] ] ]] ]]] a a] a]] +# The ']' is part of the character range and at the same time ends the +# character list. +EXP.[A-]= A B ] +# The first ']' is part of the character range and at the same time ends the +# character list. +EXP.[A-]]= A] B] ]] +# The first ']' is part of the character range and at the same time ends the +# character list. +EXP.[A-]]]= A]] B]] ]]] +# For negative character lists, the ']' ends the character range but does not +# end the character list. +# XXX: This is unnecessarily inconsistent but irrelevant in practice as there +# is no practical need for a character range that ends at ']'. +EXP.[^A-]= a +EXP.[^A-]]= a +EXP.[^A-]]]= a] + +.for pattern in [A-] [A-]] [A-]]] [^A-] [^A-]] [^A-]]] +. if ${WORDS:M${pattern}} != ${EXP.${pattern}} +. warning ${pattern}: ${WORDS:M${pattern}} != ${EXP.${pattern}} +. endif +.endfor + # In brackets, the backslash is just an ordinary character. # Outside brackets, it is an escape character for a few special characters. # TODO: Str_Match("\\", "[\\-]]")