| @@ -1,25 +1,26 @@ | | | @@ -1,25 +1,26 @@ |
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 | |
| @@ -47,13 +48,22 @@ modwords: | | | @@ -47,13 +48,22 @@ modwords: |
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} |