var-eval-short.mk revision 1.12 1 1.12 rillig # $NetBSD: var-eval-short.mk,v 1.12 2024/04/20 10:18:55 rillig Exp $
2 1.1 rillig #
3 1.1 rillig # Tests for each variable modifier to ensure that they only do the minimum
4 1.8 rillig # necessary computations. If the result of the expression is irrelevant,
5 1.8 rillig # the modifier should only be parsed. The modifier should not be evaluated,
6 1.8 rillig # but if it is evaluated for simplicity of the code (such as ':ts'), it must
7 1.8 rillig # not have any observable side effects.
8 1.1 rillig #
9 1.1 rillig # See also:
10 1.1 rillig # var.c, the comment starting with 'The ApplyModifier functions'
11 1.1 rillig # ParseModifierPart, for evaluating nested expressions
12 1.1 rillig # cond-short.mk
13 1.1 rillig
14 1.1 rillig FAIL= ${:!echo unexpected 1>&2!}
15 1.1 rillig
16 1.1 rillig # The following tests only ensure that nested expressions are not evaluated.
17 1.1 rillig # They cannot ensure that any unexpanded text returned from ParseModifierPart
18 1.1 rillig # is ignored as well. To do that, it is necessary to step through the code of
19 1.1 rillig # each modifier.
20 1.1 rillig
21 1.11 rillig # TODO: Test the modifiers in the same order as they occur in ApplyModifier.
22 1.8 rillig
23 1.1 rillig .if 0 && ${FAIL}
24 1.1 rillig .endif
25 1.1 rillig
26 1.1 rillig .if 0 && ${VAR::=${FAIL}}
27 1.1 rillig .elif defined(VAR)
28 1.1 rillig . error
29 1.1 rillig .endif
30 1.1 rillig
31 1.1 rillig .if 0 && ${${FAIL}:?then:else}
32 1.1 rillig .endif
33 1.1 rillig
34 1.1 rillig .if 0 && ${1:?${FAIL}:${FAIL}}
35 1.1 rillig .endif
36 1.1 rillig
37 1.1 rillig .if 0 && ${0:?${FAIL}:${FAIL}}
38 1.1 rillig .endif
39 1.1 rillig
40 1.5 rillig # Before var.c 1.870 from 2021-03-14, the expression ${FAIL} was evaluated
41 1.4 rillig # after the loop, when undefining the temporary global loop variable.
42 1.5 rillig # Since var.c 1.907 from 2021-04-04, a '$' is no longer allowed in the
43 1.5 rillig # variable name.
44 1.12 rillig # expect+2: while evaluating "${:Uword:@${FAIL}@expr@}": In the :@ modifier, the variable name "${FAIL}" must not contain a dollar
45 1.10 rillig # expect+1: Malformed conditional (0 && ${:Uword:@${FAIL}@expr@})
46 1.1 rillig .if 0 && ${:Uword:@${FAIL}@expr@}
47 1.1 rillig .endif
48 1.1 rillig
49 1.1 rillig .if 0 && ${:Uword:@var@${FAIL}@}
50 1.1 rillig .endif
51 1.1 rillig
52 1.6 rillig # Before var.c 1.877 from 2021-03-14, the modifier ':[...]' did not expand
53 1.4 rillig # the nested expression ${FAIL} and then tried to parse the unexpanded text,
54 1.4 rillig # which failed since '$' is not a valid range character.
55 1.1 rillig .if 0 && ${:Uword:[${FAIL}]}
56 1.1 rillig .endif
57 1.1 rillig
58 1.6 rillig # Before var.c 1.867 from 2021-03-14, the modifier ':_' defined the variable
59 1.4 rillig # even though the whole expression should have only been parsed, not
60 1.4 rillig # evaluated.
61 1.1 rillig .if 0 && ${:Uword:_=VAR}
62 1.1 rillig .elif defined(VAR)
63 1.1 rillig . error
64 1.1 rillig .endif
65 1.1 rillig
66 1.6 rillig # Before var.c 1.856 from 2021-03-14, the modifier ':C' did not expand the
67 1.7 rillig # nested expression ${FAIL}, which is correct, and then tried to compile the
68 1.7 rillig # unexpanded text as a regular expression, which is unnecessary since the
69 1.7 rillig # right-hand side of the '&&' cannot influence the outcome of the condition.
70 1.7 rillig # Compiling the regular expression then failed both because of the '{FAIL}',
71 1.7 rillig # which is not a valid repetition of the form '{1,5}', and because of the
72 1.7 rillig # '****', which are repeated repetitions as well.
73 1.4 rillig # '${FAIL}'
74 1.1 rillig .if 0 && ${:Uword:C,${FAIL}****,,}
75 1.1 rillig .endif
76 1.1 rillig
77 1.1 rillig DEFINED= # defined
78 1.1 rillig .if 0 && ${DEFINED:D${FAIL}}
79 1.1 rillig .endif
80 1.1 rillig
81 1.1 rillig .if 0 && ${:Uword:E}
82 1.1 rillig .endif
83 1.1 rillig
84 1.9 rillig # Before var.c 1.1050 from 2023-05-09, the ':gmtime' modifier produced the
85 1.9 rillig # error message 'Invalid time value: ${FAIL}}' since it did not expand its
86 1.9 rillig # argument.
87 1.1 rillig .if 0 && ${:Uword:gmtime=${FAIL}}
88 1.1 rillig .endif
89 1.1 rillig
90 1.1 rillig .if 0 && ${:Uword:H}
91 1.1 rillig .endif
92 1.1 rillig
93 1.1 rillig .if 0 && ${:Uword:hash}
94 1.1 rillig .endif
95 1.1 rillig
96 1.1 rillig .if 0 && ${value:L}
97 1.1 rillig .endif
98 1.1 rillig
99 1.9 rillig # Before var.c 1.1050 from 2023-05-09, the ':localtime' modifier produced the
100 1.9 rillig # error message 'Invalid time value: ${FAIL}}' since it did not expand its
101 1.9 rillig # argument.
102 1.1 rillig .if 0 && ${:Uword:localtime=${FAIL}}
103 1.1 rillig .endif
104 1.1 rillig
105 1.1 rillig .if 0 && ${:Uword:M${FAIL}}
106 1.1 rillig .endif
107 1.1 rillig
108 1.1 rillig .if 0 && ${:Uword:N${FAIL}}
109 1.1 rillig .endif
110 1.1 rillig
111 1.1 rillig .if 0 && ${:Uword:O}
112 1.1 rillig .endif
113 1.1 rillig
114 1.1 rillig .if 0 && ${:Uword:Ox}
115 1.1 rillig .endif
116 1.1 rillig
117 1.1 rillig .if 0 && ${:Uword:P}
118 1.1 rillig .endif
119 1.1 rillig
120 1.1 rillig .if 0 && ${:Uword:Q}
121 1.1 rillig .endif
122 1.1 rillig
123 1.1 rillig .if 0 && ${:Uword:q}
124 1.1 rillig .endif
125 1.1 rillig
126 1.1 rillig .if 0 && ${:Uword:R}
127 1.1 rillig .endif
128 1.1 rillig
129 1.1 rillig .if 0 && ${:Uword:range}
130 1.1 rillig .endif
131 1.1 rillig
132 1.1 rillig .if 0 && ${:Uword:S,${FAIL},${FAIL},}
133 1.1 rillig .endif
134 1.1 rillig
135 1.1 rillig .if 0 && ${:Uword:sh}
136 1.1 rillig .endif
137 1.1 rillig
138 1.1 rillig .if 0 && ${:Uword:T}
139 1.1 rillig .endif
140 1.1 rillig
141 1.1 rillig .if 0 && ${:Uword:ts/}
142 1.1 rillig .endif
143 1.1 rillig
144 1.1 rillig .if 0 && ${:U${FAIL}}
145 1.1 rillig .endif
146 1.1 rillig
147 1.1 rillig .if 0 && ${:Uword:u}
148 1.1 rillig .endif
149 1.1 rillig
150 1.1 rillig .if 0 && ${:Uword:word=replacement}
151 1.1 rillig .endif
152 1.1 rillig
153 1.3 rillig # Before var.c 1.875 from 2021-03-14, Var_Parse returned "${FAIL}else" for the
154 1.2 rillig # irrelevant right-hand side of the condition, even though this was not
155 1.2 rillig # necessary. Since the return value from Var_Parse is supposed to be ignored
156 1.2 rillig # anyway, and since it is actually ignored in an overly complicated way,
157 1.2 rillig # an empty string suffices.
158 1.2 rillig .MAKEFLAGS: -dcpv
159 1.2 rillig .if 0 && ${0:?${FAIL}then:${FAIL}else}
160 1.2 rillig .endif
161 1.2 rillig
162 1.2 rillig # The ':L' is applied before the ':?' modifier, giving the expression a name
163 1.2 rillig # and a value, just to see whether this value gets passed through or whether
164 1.2 rillig # the parse-only mode results in an empty string (only visible in the debug
165 1.3 rillig # log). As of var.c 1.875 from 2021-03-14, the value of the variable gets
166 1.3 rillig # through, even though an empty string would suffice.
167 1.2 rillig DEFINED= defined
168 1.2 rillig .if 0 && ${DEFINED:L:?${FAIL}then:${FAIL}else}
169 1.2 rillig .endif
170 1.2 rillig .MAKEFLAGS: -d0
171 1.2 rillig
172 1.1 rillig all:
173