aboutsummaryrefslogtreecommitdiff
path: root/contrib/bmake/unit-tests/varparse-errors.mk
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/bmake/unit-tests/varparse-errors.mk')
-rw-r--r--contrib/bmake/unit-tests/varparse-errors.mk70
1 files changed, 63 insertions, 7 deletions
diff --git a/contrib/bmake/unit-tests/varparse-errors.mk b/contrib/bmake/unit-tests/varparse-errors.mk
index 51a403fa898f..bd74c442e789 100644
--- a/contrib/bmake/unit-tests/varparse-errors.mk
+++ b/contrib/bmake/unit-tests/varparse-errors.mk
@@ -1,12 +1,11 @@
-# $NetBSD: varparse-errors.mk,v 1.5 2022/01/24 22:59:49 rillig Exp $
+# $NetBSD: varparse-errors.mk,v 1.26 2025/06/28 22:39:29 rillig Exp $
-# Tests for parsing and evaluating all kinds of variable expressions.
+# Tests for parsing and evaluating all kinds of expressions.
#
# This is the basis for redesigning the error handling in Var_Parse and
# Var_Subst, collecting typical and not so typical use cases.
#
# See also:
-# VarParseResult
# Var_Parse
# Var_Subst
@@ -18,14 +17,14 @@ INDIRECT= An ${:Uindirect} value.
REF_UNDEF= A reference to an ${UNDEF}undefined variable.
-ERR_UNCLOSED= An ${UNCLOSED variable expression.
+ERR_UNCLOSED= An ${UNCLOSED expression.
ERR_BAD_MOD= An ${:Uindirect:Z} expression with an unknown modifier.
ERR_EVAL= An evaluation error ${:Uvalue:C,.,\3,}.
-# In a conditional, a variable expression that is not enclosed in quotes is
-# expanded using the mode VARE_UNDEFERR.
+# In a conditional, an expression that is not enclosed in quotes is
+# expanded using the mode VARE_EVAL_DEFINED.
# The variable itself must be defined.
# It may refer to undefined variables though.
.if ${REF_UNDEF} != "A reference to an undefined variable."
@@ -35,6 +34,7 @@ ERR_EVAL= An evaluation error ${:Uvalue:C,.,\3,}.
# As of 2020-12-01, errors in the variable name are silently ignored.
# Since var.c 1.754 from 2020-12-20, unknown modifiers at parse time result
# in an error message and a non-zero exit status.
+# expect+1: Unknown modifier ":Z"
VAR.${:U:Z}= unknown modifier in the variable name
.if ${VAR.} != "unknown modifier in the variable name"
. error
@@ -43,6 +43,7 @@ VAR.${:U:Z}= unknown modifier in the variable name
# As of 2020-12-01, errors in the variable name are silently ignored.
# Since var.c 1.754 from 2020-12-20, unknown modifiers at parse time result
# in an error message and a non-zero exit status.
+# expect+1: Unknown modifier ":Z"
VAR.${:U:Z}post= unknown modifier with text in the variable name
.if ${VAR.post} != "unknown modifier with text in the variable name"
. error
@@ -65,7 +66,62 @@ VAR.${:U:Z}post= unknown modifier with text in the variable name
#
#.MAKEFLAGS: -dv
IND= ${: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
-all:
+
+# Before var.c 1.032 from 2022-08-24, make complained about 'Unknown modifier'
+# or 'Bad modifier' when in fact the modifier was entirely correct, it was
+# just not delimited by either ':' or '}' but instead by '\0'.
+# expect+1: Unclosed expression, expecting "}" for modifier "Q"
+UNCLOSED:= ${:U:Q
+# expect+1: Unclosed expression, expecting "}" for modifier "sh"
+UNCLOSED:= ${:U:sh
+# expect+1: Unclosed expression, expecting "}" for modifier "tA"
+UNCLOSED:= ${:U:tA
+# expect+1: Unclosed expression, expecting "}" for modifier "tsX"
+UNCLOSED:= ${:U:tsX
+# expect+1: Unclosed expression, expecting "}" for modifier "ts"
+UNCLOSED:= ${:U:ts
+# expect+1: Unclosed expression, expecting "}" for modifier "ts\040"
+UNCLOSED:= ${:U:ts\040
+# expect+1: Unclosed expression, expecting "}" for modifier "u"
+UNCLOSED:= ${:U:u
+# expect+1: Unclosed expression, expecting "}" for modifier "H"
+UNCLOSED:= ${:U:H
+# expect+1: Unclosed expression, expecting "}" for modifier "[1]"
+UNCLOSED:= ${:U:[1]
+# expect+1: Unclosed expression, expecting "}" for modifier "hash"
+UNCLOSED:= ${:U:hash
+# expect+1: Unclosed expression, expecting "}" for modifier "range"
+UNCLOSED:= ${:U:range
+# expect+1: Unclosed expression, expecting "}" for modifier "_"
+UNCLOSED:= ${:U:_
+# expect+1: Unclosed expression, expecting "}" for modifier "gmtime"
+UNCLOSED:= ${:U:gmtime
+# expect+1: Unclosed expression, expecting "}" for modifier "localtime"
+UNCLOSED:= ${:U:localtime
+
+
+# In a stack trace that has both evaluation details and included files, list
+# the current file twice: Once in the first line and once in the call
+# hierarchy. While this is redundant, omitting the current file from the
+# call hierarchy is more confusing, as the '.include' line does not contain
+# the faulty expression.
+#
+# expect: make: varparse-errors.tmp:1: Unknown modifier ":Z"
+# expect: while evaluating "${:Z}" with value ""
+# expect: while evaluating variable "INDIRECT" with value "${:Z}"
+# expect: while evaluating variable "VALUE" with value "${INDIRECT}"
+# expect: in varparse-errors.tmp:1
+# expect: in varparse-errors.mk:126
+_!= echo '.info $${VALUE}' > varparse-errors.tmp
+VALUE= ${INDIRECT}
+INDIRECT= ${:Z}
+# The "${.OBJDIR}/" is necessary to bypass the directory cache.
+.include "${.OBJDIR}/varparse-errors.tmp"
+_!= rm -f varparse-errors.tmp