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 make(1): add test for surprising par...



details:   https://anonhg.NetBSD.org/src/rev/66e1ee1ee2d1
branches:  trunk
changeset: 956571:66e1ee1ee2d1
user:      rillig <rillig%NetBSD.org@localhost>
date:      Sun Nov 01 19:25:23 2020 +0000

description:
make(1): add test for surprising parsing result of the :M modifier

diffstat:

 usr.bin/make/unit-tests/varmod-match-escape.exp |  33 +++++++++++++++++++++++-
 usr.bin/make/unit-tests/varmod-match-escape.mk  |  32 ++++++++++++++++++++++-
 2 files changed, 61 insertions(+), 4 deletions(-)

diffs (95 lines):

diff -r 0925d927203d -r 66e1ee1ee2d1 usr.bin/make/unit-tests/varmod-match-escape.exp
--- a/usr.bin/make/unit-tests/varmod-match-escape.exp   Sun Nov 01 19:02:22 2020 +0000
+++ b/usr.bin/make/unit-tests/varmod-match-escape.exp   Sun Nov 01 19:25:23 2020 +0000
@@ -1,3 +1,5 @@
+Global:SPECIALS = \: : \\ * \*
+CondParser_Eval: ${SPECIALS:M${:U}\:} != ${SPECIALS:M\:${:U}}
 Var_Parse: ${SPECIALS:M${:U}\:} != ${SPECIALS:M\:${:U}} with VARE_UNDEFERR|VARE_WANTRES
 Applying ${SPECIALS:M...} to "\: : \\ * \*" (VARE_UNDEFERR|VARE_WANTRES, none, none)
 Var_Parse: ${:U}\: with VARE_UNDEFERR|VARE_WANTRES
@@ -24,6 +26,33 @@
 VarMatch [*] [:]
 VarMatch [\*] [:]
 Result of ${SPECIALS:M\:${:U}} is ":" (VARE_UNDEFERR|VARE_WANTRES, none, none)
-Global:.MAKEFLAGS =  -r -k -d v -d
-Global:.MAKEFLAGS =  -r -k -d v -d 0
+lhs = ":", rhs = ":", op = !=
+Global:VALUES = : :: :\:
+CondParser_Eval: ${VALUES:M\:${:U\:}} != ${VALUES:M${:U\:}\:}
+Var_Parse: ${VALUES:M\:${:U\:}} != ${VALUES:M${:U\:}\:} with VARE_UNDEFERR|VARE_WANTRES
+Applying ${VALUES:M...} to ": :: :\:" (VARE_UNDEFERR|VARE_WANTRES, none, none)
+Var_Parse: ${:U:} with VARE_UNDEFERR|VARE_WANTRES
+Applying ${:U} to "" (VARE_UNDEFERR|VARE_WANTRES, none, VEF_UNDEF)
+Result of ${:U} is "" (VARE_UNDEFERR|VARE_WANTRES, none, VEF_UNDEF|VEF_DEF)
+Pattern[VALUES] for [: :: :\:] is [:]
+ModifyWords: split ": :: :\:" into 3 words
+VarMatch [:] [:]
+VarMatch [::] [:]
+VarMatch [:\:] [:]
+Result of ${VALUES:M\:${:U\:}} is ":" (VARE_UNDEFERR|VARE_WANTRES, none, none)
+Var_Parse: ${VALUES:M${:U\:}\:} with VARE_UNDEFERR|VARE_WANTRES
+Applying ${VALUES:M...} to ": :: :\:" (VARE_UNDEFERR|VARE_WANTRES, none, none)
+Var_Parse: ${:U\:}\: with VARE_UNDEFERR|VARE_WANTRES
+Applying ${:U...} to "" (VARE_UNDEFERR|VARE_WANTRES, none, VEF_UNDEF)
+Result of ${:U\:} is ":" (VARE_UNDEFERR|VARE_WANTRES, none, VEF_UNDEF|VEF_DEF)
+Pattern[VALUES] for [: :: :\:] is [:\:]
+ModifyWords: split ": :: :\:" into 3 words
+VarMatch [:] [:\:]
+VarMatch [::] [:\:]
+VarMatch [:\:] [:\:]
+Result of ${VALUES:M${:U\:}\:} is "::" (VARE_UNDEFERR|VARE_WANTRES, none, none)
+lhs = ":", rhs = "::", op = !=
+make: "varmod-match-escape.mk" line 42: warning: XXX: Oops
+Global:.MAKEFLAGS =  -r -k -d cv -d
+Global:.MAKEFLAGS =  -r -k -d cv -d 0
 exit status 0
diff -r 0925d927203d -r 66e1ee1ee2d1 usr.bin/make/unit-tests/varmod-match-escape.mk
--- a/usr.bin/make/unit-tests/varmod-match-escape.mk    Sun Nov 01 19:02:22 2020 +0000
+++ b/usr.bin/make/unit-tests/varmod-match-escape.mk    Sun Nov 01 19:25:23 2020 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: varmod-match-escape.mk,v 1.3 2020/11/01 19:02:22 rillig Exp $
+# $NetBSD: varmod-match-escape.mk,v 1.4 2020/11/01 19:25:23 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
@@ -9,11 +9,39 @@
 # are unescaped, and in the pattern matching these have the same meaning as
 # their plain variants '{', '}' and ':'.  In the pattern matching from
 # Str_Match, only \*, \? or \[ would make a noticeable difference.
+
+.MAKEFLAGS: -dcv
+
 SPECIALS=      \: : \\ * \*
-.MAKEFLAGS: -dv
 .if ${SPECIALS:M${:U}\:} != ${SPECIALS:M\:${:U}}
 .  warning unexpected
 .endif
+
+# And now both cases combined: A single modifier with both an escaped ':'
+# as well as a variable expression that expands to a ':'.
+#
+# XXX: As of 2020-11-01, when an escaped ':' occurs before the variable
+# expression, the whole modifier text is subject to unescaping '\:' to ':',
+# before the variable expression is expanded.  This means that the '\:' in
+# the variable expression is expanded as well, turning ${:U\:} into a simple
+# ${:U:}, which silently expands to an empty string, instead of generating
+# an error message.
+#
+# XXX: As of 2020-11-01, the modifier on the right-hand side of the
+# comparison is parsed differently though.  First, the variable expression
+# is parsed, resulting in ':' and needSubst=TRUE.  After that, the escaped
+# ':' is seen, and this time, copy=TRUE is not executed but stays copy=FALSE.
+# Therefore the escaped ':' is kept as-is, and the final pattern becomes
+# ':\:'.
+#
+# If ApplyModifier_Match had used the same parsing algorithm as Var_Subst,
+# both patterns would end up as '::'.
+#
+VALUES=                : :: :\:
+.if ${VALUES:M\:${:U\:}} != ${VALUES:M${:U\:}\:}
+.  warning XXX: Oops
+.endif
+
 .MAKEFLAGS: -d0
 
 all:



Home | Main Index | Thread Index | Old Index