0da408536e
Same as in the :S modifier.
167 lines
4.0 KiB
Makefile
167 lines
4.0 KiB
Makefile
# $Id: moderrs.mk,v 1.9 2020/07/31 13:30:09 rillig Exp $
|
|
#
|
|
# various modifier error tests
|
|
|
|
VAR=TheVariable
|
|
# incase we have to change it ;-)
|
|
MOD_UNKN=Z
|
|
MOD_TERM=S,V,v
|
|
MOD_S:= ${MOD_TERM},
|
|
|
|
FIB= 1 1 2 3 5 8 13 21 34
|
|
|
|
all: modunkn modunknV varterm vartermV modtermV modloop
|
|
all: modloop-close
|
|
all: modwords
|
|
all: modexclam
|
|
all: mod-subst-delimiter
|
|
all: mod-regex-delimiter
|
|
all: mod-ts-parse
|
|
all: mod-t-parse
|
|
all: mod-ifelse-parse
|
|
all: mod-assign-parse
|
|
all: mod-remember-parse
|
|
all: mod-sysv-parse
|
|
|
|
modunkn:
|
|
@echo "Expect: Unknown modifier 'Z'"
|
|
@echo "VAR:Z=${VAR:Z}"
|
|
|
|
modunknV:
|
|
@echo "Expect: Unknown modifier 'Z'"
|
|
@echo "VAR:${MOD_UNKN}=${VAR:${MOD_UNKN}}"
|
|
|
|
varterm:
|
|
@echo "Expect: Unclosed variable specification for VAR"
|
|
@echo VAR:S,V,v,=${VAR:S,V,v,
|
|
|
|
vartermV:
|
|
@echo "Expect: Unclosed variable specification for VAR"
|
|
@echo VAR:${MOD_TERM},=${VAR:${MOD_S}
|
|
|
|
modtermV:
|
|
@echo "Expect: Unclosed substitution for VAR (, missing)"
|
|
-@echo "VAR:${MOD_TERM}=${VAR:${MOD_TERM}}"
|
|
|
|
modloop:
|
|
@echo "Expect: 2 errors about missing @ delimiter"
|
|
@echo ${UNDEF:U1 2 3:@var}
|
|
@echo ${UNDEF:U1 2 3:@var@...}
|
|
@echo ${UNDEF:U1 2 3:@var@${var}@}
|
|
|
|
# The closing brace after the ${var} is part of the replacement string.
|
|
# In ParseModifierPart, braces and parentheses don't have to be balanced.
|
|
# This is contrary to the :M, :N modifiers, where both parentheses and
|
|
# braces must be balanced.
|
|
# This is also contrary to the SysV modifier, where only the actually
|
|
# used delimiter (either braces or parentheses) must be balanced.
|
|
modloop-close:
|
|
@echo $@:
|
|
@echo ${UNDEF:U1 2 3:@var@${var}}...@
|
|
@echo ${UNDEF:U1 2 3:@var@${var}}...@}
|
|
|
|
modwords:
|
|
@echo "Expect: 2 errors about missing ] delimiter"
|
|
@echo ${UNDEF:U1 2 3:[}
|
|
@echo ${UNDEF:U1 2 3:[#}
|
|
|
|
# out of bounds => empty
|
|
@echo 13=${UNDEF:U1 2 3:[13]}
|
|
|
|
# Word index out of bounds.
|
|
#
|
|
# On LP64I32, strtol returns LONG_MAX,
|
|
# which is then truncated to int (undefined behavior),
|
|
# typically resulting in -1.
|
|
# This -1 is interpreted as "the last word".
|
|
#
|
|
# On ILP32, strtol returns LONG_MAX,
|
|
# which is a large number.
|
|
# This results in a range from LONG_MAX - 1 to 3,
|
|
# which is empty.
|
|
@echo 12345=${UNDEF:U1 2 3:[123451234512345123451234512345]:S,^$,ok,:S,^3$,ok,}
|
|
|
|
modexclam:
|
|
@echo "Expect: 2 errors about missing ! delimiter"
|
|
@echo ${VARNAME:!echo}
|
|
# When the final exclamation mark is missing, there is no
|
|
# fallback to the SysV substitution modifier.
|
|
# If there were a fallback, the output would be "exclam",
|
|
# and the above would have produced an "Unknown modifier '!'".
|
|
@echo ${!:L:!=exclam}
|
|
|
|
# XXX: For "${VAR:S", I wonder where the "(@ missing)" comes from.
|
|
# This could be undefined behavior, but it's reproducible.
|
|
mod-subst-delimiter:
|
|
@echo $@:
|
|
@echo ${VAR:S
|
|
@echo ${VAR:S,
|
|
@echo ${VAR:S,from
|
|
@echo ${VAR:S,from,
|
|
@echo ${VAR:S,from,to
|
|
@echo ${VAR:S,from,to,
|
|
@echo ${VAR:S,from,to,}
|
|
@echo 1: ${VAR:S
|
|
@echo 2: ${VAR:S,
|
|
@echo 3: ${VAR:S,from
|
|
@echo ${VAR:S,from,
|
|
@echo ${VAR:S,from,to
|
|
@echo ${VAR:S,from,to,
|
|
@echo ${VAR:S,from,to,}
|
|
|
|
mod-regex-delimiter:
|
|
@echo $@:
|
|
@echo ${VAR:C
|
|
@echo ${VAR:C,
|
|
@echo ${VAR:C,from
|
|
@echo ${VAR:C,from,
|
|
@echo ${VAR:C,from,to
|
|
@echo ${VAR:C,from,to,
|
|
@echo ${VAR:C,from,to,}
|
|
@echo 1: ${VAR:C
|
|
@echo 2: ${VAR:C,
|
|
@echo 3: ${VAR:C,from
|
|
@echo ${VAR:C,from,
|
|
@echo ${VAR:C,from,to
|
|
@echo ${VAR:C,from,to,
|
|
@echo ${VAR:C,from,to,}
|
|
|
|
mod-ts-parse:
|
|
@echo $@:
|
|
@echo ${FIB:ts}
|
|
@echo ${FIB:ts\65} # octal 065 == U+0035 == '5'
|
|
@echo ${FIB:ts\65oct} # bad modifier
|
|
@echo ${FIB:tsxy} # modifier too long
|
|
|
|
mod-t-parse:
|
|
@echo $@:
|
|
@echo ${FIB:txy}
|
|
@echo ${FIB:t}
|
|
@echo ${FIB:t:M*}
|
|
|
|
mod-ifelse-parse:
|
|
@echo $@:
|
|
@echo ${FIB:?
|
|
@echo ${FIB:?then
|
|
@echo ${FIB:?then:
|
|
@echo ${FIB:?then:else
|
|
@echo ${FIB:?then:else}
|
|
|
|
mod-assign-parse:
|
|
@echo $@:
|
|
@echo ${ASSIGN::x} # 'x' is an unknown assignment operator
|
|
@echo ${::=value} # trying to set the empty variable
|
|
@echo ${ASSIGN::=value # missing closing brace
|
|
|
|
mod-remember-parse:
|
|
@echo $@:
|
|
@echo ${FIB:_} # ok
|
|
@echo ${FIB:__} # modifier name too long
|
|
|
|
mod-sysv-parse:
|
|
@echo $@:
|
|
@echo ${FIB:3
|
|
@echo ${FIB:3=
|
|
@echo ${FIB:3=x3
|
|
@echo ${FIB:3=x3} # ok
|