Module Name: src Committed By: rillig Date: Mon Mar 15 17:54:50 UTC 2021
Modified Files: src/usr.bin/make/unit-tests: varmod-loop.exp varmod-loop.mk Log Message: tests/make: convert varmod-loop to parse-time In case of unexpected failures, this provides the line number of the '.error' directive. To generate a diff of this commit: cvs rdiff -u -r1.7 -r1.8 src/usr.bin/make/unit-tests/varmod-loop.exp cvs rdiff -u -r1.12 -r1.13 src/usr.bin/make/unit-tests/varmod-loop.mk Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.bin/make/unit-tests/varmod-loop.exp diff -u src/usr.bin/make/unit-tests/varmod-loop.exp:1.7 src/usr.bin/make/unit-tests/varmod-loop.exp:1.8 --- src/usr.bin/make/unit-tests/varmod-loop.exp:1.7 Mon Mar 15 17:11:08 2021 +++ src/usr.bin/make/unit-tests/varmod-loop.exp Mon Mar 15 17:54:49 2021 @@ -1,18 +1,12 @@ -ParseReadLine (133): 'USE_8_DOLLARS= ${:U1:@var@${8_DOLLARS}@} ${8_DOLLARS} $$$$$$$$' +ParseReadLine (144): 'USE_8_DOLLARS= ${:U1:@var@${8_DOLLARS}@} ${8_DOLLARS} $$$$$$$$' CondParser_Eval: ${USE_8_DOLLARS} != "\$\$\$\$ \$\$\$\$ \$\$\$\$" lhs = "$$$$ $$$$ $$$$", rhs = "$$$$ $$$$ $$$$", op = != -ParseReadLine (138): 'SUBST_CONTAINING_LOOP:= ${USE_8_DOLLARS}' +ParseReadLine (149): 'SUBST_CONTAINING_LOOP:= ${USE_8_DOLLARS}' CondParser_Eval: ${SUBST_CONTAINING_LOOP} != "\$\$ \$\$\$\$ \$\$\$\$" lhs = "$$ $$$$ $$$$", rhs = "$$ $$$$ $$$$", op = != -ParseReadLine (163): '.MAKEFLAGS: -d0' +ParseReadLine (174): '.MAKEFLAGS: -d0' ParseDoDependency(.MAKEFLAGS: -d0) -mod-loop-varname: -:+one+ +two+ +three+: -:x1y x2y x3y: -:x1y x2y x3y: -:mod-loop-varname: :x1y x2y x3y: :: -:x1y x2y x3y: -empty: :xy xy xy: +:varname-overwriting-target: :x1y x2y x3y: :: mod-loop-resolve:w1d2d3w w2i3w w1i2d3 2i${RES3}w w1d2d3 2i${RES3} 1i${RES2}w: mod-loop-varname-dollar:(1) (2) (3). mod-loop-varname-dollar:() () (). Index: src/usr.bin/make/unit-tests/varmod-loop.mk diff -u src/usr.bin/make/unit-tests/varmod-loop.mk:1.12 src/usr.bin/make/unit-tests/varmod-loop.mk:1.13 --- src/usr.bin/make/unit-tests/varmod-loop.mk:1.12 Mon Mar 15 17:11:08 2021 +++ src/usr.bin/make/unit-tests/varmod-loop.mk Mon Mar 15 17:54:49 2021 @@ -1,10 +1,10 @@ -# $NetBSD: varmod-loop.mk,v 1.12 2021/03/15 17:11:08 rillig Exp $ +# $NetBSD: varmod-loop.mk,v 1.13 2021/03/15 17:54:49 rillig Exp $ # # Tests for the :@var@...${var}...@ variable modifier. .MAKE.SAVE_DOLLARS= yes -all: mod-loop-varname +all: varname-overwriting-target all: mod-loop-resolve all: mod-loop-varname-dollar all: mod-loop-dollar @@ -13,31 +13,42 @@ all: mod-loop-dollar # dynamically. There's no practical use-case for this, and hopefully nobody # will ever depend on this, but technically it's possible. # Therefore, in -dL mode, this is forbidden, see lint.mk. -mod-loop-varname: - @echo $@: - @echo :${:Uone two three:@${:Ubar:S,b,v,}@+${var}+@:Q}: - - # ":::" is a very creative variable name, unlikely in practice. - # The expression ${\:\:\:} would not work since backslashes can only - # be escaped in the modifiers, but not in the variable name. - @echo :${:U1 2 3:@:::@x${${:U\:\:\:}}y@}: +.if ${:Uone two three:@${:Ubar:S,b,v,}@+${var}+@} != "+one+ +two+ +three+" +. error +.endif + +# ":::" is a very creative variable name, unlikely in practice. +# The expression ${\:\:\:} would not work since backslashes can only +# be escaped in the modifiers, but not in the variable name. +.if ${:U1 2 3:@:::@x${${:U\:\:\:}}y@} != "x1y x2y x3y" +. error +.endif - # "@@" is another creative variable name. - @echo :${:U1 2 3:@\@\@@x${@@}y@}: +# "@@" is another creative variable name. +.if ${:U1 2 3:@\@\@@x${@@}y@} != "x1y x2y x3y" +. error +.endif +varname-overwriting-target: # Even "@" works as a variable name since the variable is installed # in the "current" scope, which in this case is the one from the - # target. + # target. Because of this, after the loop has finished, '$@' is + # undefined. This is something that make doesn't expect, this may + # even trigger an assertion failure somewhere. @echo :$@: :${:U1 2 3:@\@@x${@}y@}: :$@: - # In extreme cases, even the backslash can be used as variable name. - # It needs to be doubled though. - @echo :${:U1 2 3:@\\@x${${:Ux:S,x,\\,}}y@}: - - # The variable name can technically be empty, and in this situation - # the variable value cannot be accessed since the empty "variable" - # is protected to always return an empty string. - @echo empty: :${:U1 2 3:@@x${}y@}: +# In extreme cases, even the backslash can be used as variable name. +# It needs to be doubled though. +.if ${:U1 2 3:@\\@x${${:Ux:S,x,\\,}}y@} != "x1y x2y x3y" +. error +.endif + +# The variable name can technically be empty, and in this situation +# the variable value cannot be accessed since the empty "variable" +# is protected to always return an empty string. +.if ${:U1 2 3:@@x${}y@} != "xy xy xy" +. error +.endif # The :@ modifier resolves the variables from the replacement text once more