| @@ -1,59 +1,69 @@ | | | @@ -1,59 +1,69 @@ |
1 | # $Id: moderrs.mk,v 1.3 2020/07/26 14:16:45 rillig Exp $ | | 1 | # $Id: moderrs.mk,v 1.4 2020/07/26 14:39:46 rillig Exp $ |
2 | # | | 2 | # |
3 | # various modifier error tests | | 3 | # various modifier error tests |
4 | | | 4 | |
5 | VAR=TheVariable | | 5 | VAR=TheVariable |
6 | # incase we have to change it ;-) | | 6 | # incase we have to change it ;-) |
7 | MOD_UNKN=Z | | 7 | MOD_UNKN=Z |
8 | MOD_TERM=S,V,v | | 8 | MOD_TERM=S,V,v |
9 | MOD_S:= ${MOD_TERM}, | | 9 | MOD_S:= ${MOD_TERM}, |
10 | | | 10 | |
11 | all: modunkn modunknV varterm vartermV modtermV modloop | | 11 | all: modunkn modunknV varterm vartermV modtermV modloop |
12 | all: modwords | | 12 | all: modwords |
| | | 13 | all: modexclam |
13 | | | 14 | |
14 | modunkn: | | 15 | modunkn: |
15 | @echo "Expect: Unknown modifier 'Z'" | | 16 | @echo "Expect: Unknown modifier 'Z'" |
16 | @echo "VAR:Z=${VAR:Z}" | | 17 | @echo "VAR:Z=${VAR:Z}" |
17 | | | 18 | |
18 | modunknV: | | 19 | modunknV: |
19 | @echo "Expect: Unknown modifier 'Z'" | | 20 | @echo "Expect: Unknown modifier 'Z'" |
20 | @echo "VAR:${MOD_UNKN}=${VAR:${MOD_UNKN}}" | | 21 | @echo "VAR:${MOD_UNKN}=${VAR:${MOD_UNKN}}" |
21 | | | 22 | |
22 | varterm: | | 23 | varterm: |
23 | @echo "Expect: Unclosed variable specification for VAR" | | 24 | @echo "Expect: Unclosed variable specification for VAR" |
24 | @echo VAR:S,V,v,=${VAR:S,V,v, | | 25 | @echo VAR:S,V,v,=${VAR:S,V,v, |
25 | | | 26 | |
26 | vartermV: | | 27 | vartermV: |
27 | @echo "Expect: Unclosed variable specification for VAR" | | 28 | @echo "Expect: Unclosed variable specification for VAR" |
28 | @echo VAR:${MOD_TERM},=${VAR:${MOD_S} | | 29 | @echo VAR:${MOD_TERM},=${VAR:${MOD_S} |
29 | | | 30 | |
30 | modtermV: | | 31 | modtermV: |
31 | @echo "Expect: Unclosed substitution for VAR (, missing)" | | 32 | @echo "Expect: Unclosed substitution for VAR (, missing)" |
32 | -@echo "VAR:${MOD_TERM}=${VAR:${MOD_TERM}}" | | 33 | -@echo "VAR:${MOD_TERM}=${VAR:${MOD_TERM}}" |
33 | | | 34 | |
34 | modloop: | | 35 | modloop: |
35 | @echo "Expect: 2 errors about missing @ delimiter" | | 36 | @echo "Expect: 2 errors about missing @ delimiter" |
36 | @echo ${UNDEF:U1 2 3:@var} | | 37 | @echo ${UNDEF:U1 2 3:@var} |
37 | @echo ${UNDEF:U1 2 3:@var@...} | | 38 | @echo ${UNDEF:U1 2 3:@var@...} |
38 | @echo ${UNDEF:U1 2 3:@var@${var}@} | | 39 | @echo ${UNDEF:U1 2 3:@var@${var}@} |
39 | | | 40 | |
40 | modwords: | | 41 | modwords: |
41 | @echo "Expect: 2 errors about missing ] delimiter" | | 42 | @echo "Expect: 2 errors about missing ] delimiter" |
42 | @echo ${UNDEF:U1 2 3:[} | | 43 | @echo ${UNDEF:U1 2 3:[} |
43 | @echo ${UNDEF:U1 2 3:[#} | | 44 | @echo ${UNDEF:U1 2 3:[#} |
44 | | | 45 | |
45 | # out of bounds => empty | | 46 | # out of bounds => empty |
46 | @echo 13=${UNDEF:U1 2 3:[13]} | | 47 | @echo 13=${UNDEF:U1 2 3:[13]} |
47 | | | 48 | |
48 | # Word index out of bounds. | | 49 | # Word index out of bounds. |
49 | # | | 50 | # |
50 | # On LP64I32, strtol returns LONG_MAX, | | 51 | # On LP64I32, strtol returns LONG_MAX, |
51 | # which is then truncated to int (undefined behavior), | | 52 | # which is then truncated to int (undefined behavior), |
52 | # typically resulting in -1. | | 53 | # typically resulting in -1. |
53 | # This -1 is interpreted as "the last word". | | 54 | # This -1 is interpreted as "the last word". |
54 | # | | 55 | # |
55 | # On ILP32, strtol returns LONG_MAX, | | 56 | # On ILP32, strtol returns LONG_MAX, |
56 | # which is a large number. | | 57 | # which is a large number. |
57 | # This results in a range from LONG_MAX - 1 to 3, | | 58 | # This results in a range from LONG_MAX - 1 to 3, |
58 | # which is empty. | | 59 | # which is empty. |
59 | @echo 12345=${UNDEF:U1 2 3:[123451234512345123451234512345]:S,^$,ok,:S,^3$,ok,} | | 60 | @echo 12345=${UNDEF:U1 2 3:[123451234512345123451234512345]:S,^$,ok,:S,^3$,ok,} |
| | | 61 | |
| | | 62 | modexclam: |
| | | 63 | @echo "Expect: 2 errors about missing ! delimiter" |
| | | 64 | @echo ${VARNAME:!echo} |
| | | 65 | # When the final exclamation mark is missing, there is no |
| | | 66 | # fallback to the SysV substitution modifier. |
| | | 67 | # If there were a fallback, the output would be "exclam", |
| | | 68 | # and the above would have produced an "Unknown modifier '!'". |
| | | 69 | @echo ${!:L:!=exclam} |