Sun Jul 19 17:24:22 2020 UTC ()
make(1): demonstrate off-by-one bug in :C modifier


(rillig)
diff -r1.15 -r1.16 src/usr.bin/make/unit-tests/modmisc.exp
diff -r1.13 -r1.14 src/usr.bin/make/unit-tests/modmisc.mk

cvs diff -r1.15 -r1.16 src/usr.bin/make/unit-tests/modmisc.exp (expand / switch to unified diff)

--- src/usr.bin/make/unit-tests/modmisc.exp 2020/07/19 15:16:22 1.15
+++ src/usr.bin/make/unit-tests/modmisc.exp 2020/07/19 17:24:22 1.16
@@ -41,14 +41,24 @@ mod-subst-dollar:$3: @@ -41,14 +41,24 @@ mod-subst-dollar:$3:
41mod-subst-dollar:$4: 41mod-subst-dollar:$4:
42mod-subst-dollar:$5: 42mod-subst-dollar:$5:
43mod-subst-dollar:$6: 43mod-subst-dollar:$6:
44mod-subst-dollar:$7: 44mod-subst-dollar:$7:
45mod-subst-dollar:$8: 45mod-subst-dollar:$8:
46mod-subst-dollar:U8: 46mod-subst-dollar:U8:
47mod-subst-dollar:$$$$: 47mod-subst-dollar:$$$$:
48mod-loop-dollar:1: 48mod-loop-dollar:1:
49mod-loop-dollar:${word}: 49mod-loop-dollar:${word}:
50mod-loop-dollar:$3$: 50mod-loop-dollar:$3$:
51mod-loop-dollar:$${word}$: 51mod-loop-dollar:$${word}$:
52mod-loop-dollar:$$5$$: 52mod-loop-dollar:$$5$$:
53mod-loop-dollar:$$${word}$$: 53mod-loop-dollar:$$${word}$$:
 54mod-C-limits:00-ok:1 2323 45456
 55mod-C-limits:11-missing:1 6
 56mod-C-limits:11-ok:1 22 446
 57make: No subexpression \2
 58make: No subexpression \2
 59make: No subexpression \2
 60make: No subexpression \2
 61mod-C-limits:22-missing:1 6
 62mod-C-limits:22-missing:1 6
 63mod-C-limits:22-ok:1 33 556
54exit status 0 64exit status 0

cvs diff -r1.13 -r1.14 src/usr.bin/make/unit-tests/modmisc.mk (expand / switch to unified diff)

--- src/usr.bin/make/unit-tests/modmisc.mk 2020/07/19 15:16:22 1.13
+++ src/usr.bin/make/unit-tests/modmisc.mk 2020/07/19 17:24:22 1.14
@@ -1,33 +1,34 @@ @@ -1,33 +1,34 @@
1# $Id: modmisc.mk,v 1.13 2020/07/19 15:16:22 rillig Exp $ 1# $Id: modmisc.mk,v 1.14 2020/07/19 17:24:22 rillig Exp $
2# 2#
3# miscellaneous modifier tests 3# miscellaneous modifier tests
4 4
5# do not put any dirs in this list which exist on some 5# do not put any dirs in this list which exist on some
6# but not all target systems - an exists() check is below. 6# but not all target systems - an exists() check is below.
7path=:/bin:/tmp::/:.:/no/such/dir:. 7path=:/bin:/tmp::/:.:/no/such/dir:.
8# strip cwd from path. 8# strip cwd from path.
9MOD_NODOT=S/:/ /g:N.:ts: 9MOD_NODOT=S/:/ /g:N.:ts:
10# and decorate, note that $'s need to be doubled. Also note that  10# and decorate, note that $'s need to be doubled. Also note that
11# the modifier_variable can be used with other modifiers. 11# the modifier_variable can be used with other modifiers.
12MOD_NODOTX=S/:/ /g:N.:@d@'$$d'@ 12MOD_NODOTX=S/:/ /g:N.:@d@'$$d'@
13# another mod - pretend it is more interesting 13# another mod - pretend it is more interesting
14MOD_HOMES=S,/home/,/homes/, 14MOD_HOMES=S,/home/,/homes/,
15MOD_OPT=@d@$${exists($$d):?$$d:$${d:S,/usr,/opt,}}@ 15MOD_OPT=@d@$${exists($$d):?$$d:$${d:S,/usr,/opt,}}@
16MOD_SEP=S,:, ,g 16MOD_SEP=S,:, ,g
17 17
18all: modvar modvarloop modsysv mod-HTE emptyvar undefvar 18all: modvar modvarloop modsysv mod-HTE emptyvar undefvar
19all: mod-S mod-C mod-at-varname mod-at-resolve mod-at-dollar 19all: mod-S mod-C mod-at-varname mod-at-resolve mod-at-dollar
20all: mod-subst-dollar mod-loop-dollar 20all: mod-subst-dollar mod-loop-dollar
 21all: mod-C-limits
21 22
22modsysv: 23modsysv:
23 @echo "The answer is ${libfoo.a:L:libfoo.a=42}" 24 @echo "The answer is ${libfoo.a:L:libfoo.a=42}"
24 25
25modvar: 26modvar:
26 @echo "path='${path}'" 27 @echo "path='${path}'"
27 @echo "path='${path:${MOD_NODOT}}'" 28 @echo "path='${path:${MOD_NODOT}}'"
28 @echo "path='${path:S,home,homes,:${MOD_NODOT}}'" 29 @echo "path='${path:S,home,homes,:${MOD_NODOT}}'"
29 @echo "path=${path:${MOD_NODOTX}:ts:}" 30 @echo "path=${path:${MOD_NODOTX}:ts:}"
30 @echo "path=${path:${MOD_HOMES}:${MOD_NODOTX}:ts:}" 31 @echo "path=${path:${MOD_HOMES}:${MOD_NODOTX}:ts:}"
31 32
32.for d in ${path:${MOD_SEP}:N.} /usr/xbin 33.for d in ${path:${MOD_SEP}:N.} /usr/xbin
33path_$d?= ${d:${MOD_OPT}:${MOD_HOMES}}/ 34path_$d?= ${d:${MOD_OPT}:${MOD_HOMES}}/
@@ -123,13 +124,21 @@ mod-subst-dollar: @@ -123,13 +124,21 @@ mod-subst-dollar:
123# Demonstrate that it is possible to generate dollar characters using the 124# Demonstrate that it is possible to generate dollar characters using the
124# :@ modifier. 125# :@ modifier.
125# 126#
126# These are edge cases that could have resulted in a parse error as well 127# These are edge cases that could have resulted in a parse error as well
127# since the $@ at the end could have been interpreted as a variable, which 128# since the $@ at the end could have been interpreted as a variable, which
128# would mean a missing closing @ delimiter. 129# would mean a missing closing @ delimiter.
129mod-loop-dollar: 130mod-loop-dollar:
130 @echo $@:${:U1:@word@${word}$@:Q}: 131 @echo $@:${:U1:@word@${word}$@:Q}:
131 @echo $@:${:U2:@word@$${word}$$@:Q}: 132 @echo $@:${:U2:@word@$${word}$$@:Q}:
132 @echo $@:${:U3:@word@$$${word}$$$@:Q}: 133 @echo $@:${:U3:@word@$$${word}$$$@:Q}:
133 @echo $@:${:U4:@word@$$$${word}$$$$@:Q}: 134 @echo $@:${:U4:@word@$$$${word}$$$$@:Q}:
134 @echo $@:${:U5:@word@$$$$${word}$$$$$@:Q}: 135 @echo $@:${:U5:@word@$$$$${word}$$$$$@:Q}:
135 @echo $@:${:U6:@word@$$$$$${word}$$$$$$@:Q}: 136 @echo $@:${:U6:@word@$$$$$${word}$$$$$$@:Q}:
 137
 138mod-C-limits:
 139 @echo $@:00-ok:${:U1 23 456:C,..,\0\0,:Q}
 140 @echo $@:11-missing:${:U1 23 456:C,..,\1\1,:Q}
 141 @echo $@:11-ok:${:U1 23 456:C,(.).,\1\1,:Q}
 142 @echo $@:22-missing:${:U1 23 456:C,..,\2\2,:Q}
 143 @echo $@:22-missing:${:U1 23 456:C,(.).,\2\2,:Q}
 144 @echo $@:22-ok:${:U1 23 456:C,(.)(.),\2\2,:Q}