varparse-errors.mk revision 1.16 1 # $NetBSD: varparse-errors.mk,v 1.16 2024/07/05 18:59:33 rillig Exp $
2
3 # Tests for parsing and evaluating all kinds of expressions.
4 #
5 # This is the basis for redesigning the error handling in Var_Parse and
6 # Var_Subst, collecting typical and not so typical use cases.
7 #
8 # See also:
9 # Var_Parse
10 # Var_Subst
11
12 PLAIN= plain value
13
14 LITERAL_DOLLAR= To get a dollar, double $$ it.
15
16 INDIRECT= An ${:Uindirect} value.
17
18 REF_UNDEF= A reference to an ${UNDEF}undefined variable.
19
20 ERR_UNCLOSED= An ${UNCLOSED expression.
21
22 ERR_BAD_MOD= An ${:Uindirect:Z} expression with an unknown modifier.
23
24 ERR_EVAL= An evaluation error ${:Uvalue:C,.,\3,}.
25
26 # In a conditional, an expression that is not enclosed in quotes is
27 # expanded using the mode VARE_EVAL_DEFINED.
28 # The variable itself must be defined.
29 # It may refer to undefined variables though.
30 .if ${REF_UNDEF} != "A reference to an undefined variable."
31 . error
32 .endif
33
34 # As of 2020-12-01, errors in the variable name are silently ignored.
35 # Since var.c 1.754 from 2020-12-20, unknown modifiers at parse time result
36 # in an error message and a non-zero exit status.
37 # expect+1: while evaluating "${:U:Z}": Unknown modifier "Z"
38 VAR.${:U:Z}= unknown modifier in the variable name
39 .if ${VAR.} != "unknown modifier in the variable name"
40 . error
41 .endif
42
43 # As of 2020-12-01, errors in the variable name are silently ignored.
44 # Since var.c 1.754 from 2020-12-20, unknown modifiers at parse time result
45 # in an error message and a non-zero exit status.
46 # expect+1: while evaluating "${:U:Z}post": Unknown modifier "Z"
47 VAR.${:U:Z}post= unknown modifier with text in the variable name
48 .if ${VAR.post} != "unknown modifier with text in the variable name"
49 . error
50 .endif
51
52 # Demonstrate an edge case in which the 'static' for 'errorReported' in
53 # Var_Subst actually makes a difference, preventing "a plethora of messages".
54 # Given that this is an edge case and the error message is wrong and thus
55 # misleading anyway, that piece of code is probably not necessary. The wrong
56 # condition was added in var.c 1.185 from 2014-05-19.
57 #
58 # To trigger this difference, the variable assignment must use the assignment
59 # operator ':=' to make VarEvalMode_ShouldKeepUndef return true. There must
60 # be 2 expressions that create a parse error, which in this case is ':OX'.
61 # These expressions must be nested in some way. The below expressions are
62 # minimal, that is, removing any part of it destroys the effect.
63 #
64 # Without the 'static', there would be one more message like this:
65 # Undefined variable "${:U:OX"
66 #
67 #.MAKEFLAGS: -dv
68 IND= ${:OX}
69 # expect+6: while evaluating "${:U:OX:U${IND}} ${:U:OX:U${IND}}": Bad modifier ":OX"
70 # expect+5: while evaluating "${:U:OX:U${IND}}": Bad modifier ":OX"
71 # expect+4: Undefined variable "${:U:OX"
72 # expect+3: while evaluating variable "IND" with value "${:OX}": while evaluating "${:OX}": Bad modifier ":OX"
73 # expect+2: Undefined variable "${:U:OX"
74 # expect+1: while evaluating variable "IND" with value "${:OX}": while evaluating "${:OX}": Bad modifier ":OX"
75 _:= ${:U:OX:U${IND}} ${:U:OX:U${IND}}
76 #.MAKEFLAGS: -d0
77
78
79 # Before var.c 1.032 from 2022-08-24, make complained about 'Unknown modifier'
80 # or 'Bad modifier' when in fact the modifier was entirely correct, it was
81 # just not delimited by either ':' or '}' but instead by '\0'.
82 # expect+1: while evaluating "${:U:Q": Unclosed expression, expecting '}' for modifier "Q"
83 UNCLOSED:= ${:U:Q
84 # expect+1: while evaluating "${:U:sh": Unclosed expression, expecting '}' for modifier "sh"
85 UNCLOSED:= ${:U:sh
86 # expect+1: while evaluating "${:U:tA": Unclosed expression, expecting '}' for modifier "tA"
87 UNCLOSED:= ${:U:tA
88 # expect+1: while evaluating "${:U:tsX": Unclosed expression, expecting '}' for modifier "tsX"
89 UNCLOSED:= ${:U:tsX
90 # expect+1: while evaluating "${:U:ts": Unclosed expression, expecting '}' for modifier "ts"
91 UNCLOSED:= ${:U:ts
92 # expect+1: while evaluating "${:U:ts\040": Unclosed expression, expecting '}' for modifier "ts\040"
93 UNCLOSED:= ${:U:ts\040
94 # expect+1: while evaluating "${:U:u": Unclosed expression, expecting '}' for modifier "u"
95 UNCLOSED:= ${:U:u
96 # expect+1: while evaluating "${:U:H": Unclosed expression, expecting '}' for modifier "H"
97 UNCLOSED:= ${:U:H
98 # expect+1: while evaluating "${:U:[1]": Unclosed expression, expecting '}' for modifier "[1]"
99 UNCLOSED:= ${:U:[1]
100 # expect+1: while evaluating "${:U:hash": Unclosed expression, expecting '}' for modifier "hash"
101 UNCLOSED:= ${:U:hash
102 # expect+1: while evaluating "${:U:range": Unclosed expression, expecting '}' for modifier "range"
103 UNCLOSED:= ${:U:range
104 # expect+1: while evaluating "${:U:_": Unclosed expression, expecting '}' for modifier "_"
105 UNCLOSED:= ${:U:_
106 # expect+1: while evaluating "${:U:gmtime": Unclosed expression, expecting '}' for modifier "gmtime"
107 UNCLOSED:= ${:U:gmtime
108 # expect+1: while evaluating "${:U:localtime": Unclosed expression, expecting '}' for modifier "localtime"
109 UNCLOSED:= ${:U:localtime
110