Module Name:    src
Committed By:   rillig
Date:           Sat Oct 31 12:34:03 UTC 2020

Modified Files:
        src/usr.bin/make: var.c
        src/usr.bin/make/unit-tests: varmod-loop.mk

Log Message:
make(1): add test for combining the :@ and :? variable modifiers


To generate a diff of this commit:
cvs rdiff -u -r1.617 -r1.618 src/usr.bin/make/var.c
cvs rdiff -u -r1.4 -r1.5 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/var.c
diff -u src/usr.bin/make/var.c:1.617 src/usr.bin/make/var.c:1.618
--- src/usr.bin/make/var.c:1.617	Sat Oct 31 12:22:43 2020
+++ src/usr.bin/make/var.c	Sat Oct 31 12:34:03 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: var.c,v 1.617 2020/10/31 12:22:43 rillig Exp $	*/
+/*	$NetBSD: var.c,v 1.618 2020/10/31 12:34:03 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -129,7 +129,7 @@
 #include    "metachar.h"
 
 /*	"@(#)var.c	8.3 (Berkeley) 3/19/94" */
-MAKE_RCSID("$NetBSD: var.c,v 1.617 2020/10/31 12:22:43 rillig Exp $");
+MAKE_RCSID("$NetBSD: var.c,v 1.618 2020/10/31 12:34:03 rillig Exp $");
 
 #define VAR_DEBUG1(fmt, arg1) DEBUG1(VAR, fmt, arg1)
 #define VAR_DEBUG2(fmt, arg1, arg2) DEBUG2(VAR, fmt, arg1, arg2)
@@ -1465,8 +1465,8 @@ ModifyWord_Loop(const char *word, SepBuf
     (void)Var_Subst(args->str, args->ctx, args->eflags, &s);
     /* TODO: handle errors */
 
-    VAR_DEBUG4("ModifyWord_Loop: in \"%s\", replace \"%s\" with \"%s\" "
-	       "to \"%s\"\n",
+    VAR_DEBUG4("ModifyWord_Loop: "
+	       "in \"%s\", replace \"%s\" with \"%s\" to \"%s\"\n",
 	       word, args->tvar, args->str, s);
 
     if (s[0] == '\n' || Buf_EndsWith(&buf->buf, '\n'))

Index: src/usr.bin/make/unit-tests/varmod-loop.mk
diff -u src/usr.bin/make/unit-tests/varmod-loop.mk:1.4 src/usr.bin/make/unit-tests/varmod-loop.mk:1.5
--- src/usr.bin/make/unit-tests/varmod-loop.mk:1.4	Sun Oct 18 21:12:13 2020
+++ src/usr.bin/make/unit-tests/varmod-loop.mk	Sat Oct 31 12:34:03 2020
@@ -1,4 +1,4 @@
-# $NetBSD: varmod-loop.mk,v 1.4 2020/10/18 21:12:13 rillig Exp $
+# $NetBSD: varmod-loop.mk,v 1.5 2020/10/31 12:34:03 rillig Exp $
 #
 # Tests for the :@var@...${var}...@ variable modifier.
 
@@ -13,16 +13,20 @@ all: mod-loop-dollar
 # Therefore, in -dL mode, this is forbidden, see lint.mk.
 mod-loop-varname:
 	@echo :${:Uone two three:@${:Ubar:S,b,v,}@+${var}+@:Q}:
-	# ":::" is a very creative variable name, unlikely in practice
+
+	# ":::" 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@}:
+
 	# "@@" is another creative variable name.
 	@echo :${:U1 2 3:@\@\@@x${@@}y@}:
+
 	# 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.
 	@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@}:
@@ -70,7 +74,7 @@ mod-loop-dollar:
 # It may happen that there are nested :@ modifiers that use the same name for
 # for the loop variable.  These modifiers influence each other.
 #
-# As of 2020-10-18, the :@ modifier is implemented by actually setting an
+# As of 2020-10-18, the :@ modifier is implemented by actually setting a
 # variable in the context of the expression and deleting it again after the
 # loop.  This is different from the .for loops, which substitute the variable
 # expression with ${:Uvalue}, leading to different unwanted side effects.
@@ -81,3 +85,18 @@ mod-loop-dollar:
 .if ${:U1 2 3:@i@$i${:Ua b c:@i@$i@}${i:Uu}@} != "1a b cu 2a b cu 3a b cu"
 .  error
 .endif
+
+# During the loop, the variable is actually defined and nonempty.
+# If the loop were implemented in the same way as the .for loop, the variable
+# would be neither defined nor nonempty since all expressions of the form
+# ${var} would have been replaced with ${:Uword} before evaluating them.
+.if defined(var)
+.  error
+.endif
+.if ${:Uword:@var@${defined(var):?def:undef} ${empty(var):?empty:nonempty}@} \
+    != "def nonempty"
+.  error
+.endif
+.if defined(var)
+.  error
+.endif

Reply via email to