Module Name:    src
Committed By:   rillig
Date:           Sun Mar 30 16:43:10 UTC 2025

Modified Files:
        src/usr.bin/make: for.c
        src/usr.bin/make/unit-tests: directive-for-errors.exp
            directive-for-errors.mk directive-for.exp directive-for.mk
            varmod-indirect.exp varmod-indirect.mk

Log Message:
make: if there is an error in the items of a .for loop, don't iterate


To generate a diff of this commit:
cvs rdiff -u -r1.182 -r1.183 src/usr.bin/make/for.c
cvs rdiff -u -r1.11 -r1.12 \
    src/usr.bin/make/unit-tests/directive-for-errors.exp
cvs rdiff -u -r1.15 -r1.16 \
    src/usr.bin/make/unit-tests/directive-for-errors.mk
cvs rdiff -u -r1.28 -r1.29 src/usr.bin/make/unit-tests/directive-for.exp
cvs rdiff -u -r1.29 -r1.30 src/usr.bin/make/unit-tests/directive-for.mk
cvs rdiff -u -r1.35 -r1.36 src/usr.bin/make/unit-tests/varmod-indirect.exp
cvs rdiff -u -r1.23 -r1.24 src/usr.bin/make/unit-tests/varmod-indirect.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/for.c
diff -u src/usr.bin/make/for.c:1.182 src/usr.bin/make/for.c:1.183
--- src/usr.bin/make/for.c:1.182	Fri Jun  7 18:57:30 2024
+++ src/usr.bin/make/for.c	Sun Mar 30 16:43:10 2025
@@ -1,4 +1,4 @@
-/*	$NetBSD: for.c,v 1.182 2024/06/07 18:57:30 rillig Exp $	*/
+/*	$NetBSD: for.c,v 1.183 2025/03/30 16:43:10 rillig Exp $	*/
 
 /*
  * Copyright (c) 1992, The Regents of the University of California.
@@ -58,7 +58,7 @@
 #include "make.h"
 
 /*	"@(#)for.c	8.1 (Berkeley) 6/6/93"	*/
-MAKE_RCSID("$NetBSD: for.c,v 1.182 2024/06/07 18:57:30 rillig Exp $");
+MAKE_RCSID("$NetBSD: for.c,v 1.183 2025/03/30 16:43:10 rillig Exp $");
 
 
 typedef struct ForLoop {
@@ -194,13 +194,13 @@ static bool
 ForLoop_ParseItems(ForLoop *f, const char *p)
 {
 	char *items;
+	int parseErrorsBefore = parseErrors;
 
 	cpp_skip_whitespace(&p);
 
 	items = Var_Subst(p, SCOPE_GLOBAL, VARE_EVAL);
-	/* TODO: handle errors */
-
-	f->items = Substring_Words(items, false);
+	f->items = Substring_Words(
+	    parseErrors == parseErrorsBefore ? items : "", false);
 	free(items);
 
 	if (f->items.len == 1 && Substring_IsEmpty(f->items.words[0]))

Index: src/usr.bin/make/unit-tests/directive-for-errors.exp
diff -u src/usr.bin/make/unit-tests/directive-for-errors.exp:1.11 src/usr.bin/make/unit-tests/directive-for-errors.exp:1.12
--- src/usr.bin/make/unit-tests/directive-for-errors.exp:1.11	Sun Mar 30 09:51:50 2025
+++ src/usr.bin/make/unit-tests/directive-for-errors.exp	Sun Mar 30 16:43:10 2025
@@ -8,11 +8,8 @@ make: directive-for-errors.mk:44: invali
 make: directive-for-errors.mk:52: no iteration variables in for
 make: directive-for-errors.mk:64: Wrong number of words (5) in .for substitution list with 3 variables
 make: directive-for-errors.mk:78: missing `in' in for
-make: directive-for-errors.mk:89: Unknown modifier ":Z"
+make: directive-for-errors.mk:86: Unknown modifier ":Z"
 	while evaluating "${:U3:Z} 4" with value "3"
-make: directive-for-errors.mk:93: warning: Should not be reached.
-make: directive-for-errors.mk:93: warning: Should not be reached.
-make: directive-for-errors.mk:93: warning: Should not be reached.
 make: Fatal errors encountered -- cannot continue
 make: stopped in unit-tests
 exit status 1

Index: src/usr.bin/make/unit-tests/directive-for-errors.mk
diff -u src/usr.bin/make/unit-tests/directive-for-errors.mk:1.15 src/usr.bin/make/unit-tests/directive-for-errors.mk:1.16
--- src/usr.bin/make/unit-tests/directive-for-errors.mk:1.15	Sat Mar 29 19:08:52 2025
+++ src/usr.bin/make/unit-tests/directive-for-errors.mk	Sun Mar 30 16:43:10 2025
@@ -1,4 +1,4 @@
-# $NetBSD: directive-for-errors.mk,v 1.15 2025/03/29 19:08:52 rillig Exp $
+# $NetBSD: directive-for-errors.mk,v 1.16 2025/03/30 16:43:10 rillig Exp $
 #
 # Tests for error handling in .for loops.
 
@@ -81,14 +81,8 @@ ${:U\\}=	backslash	# see whether the "va
 .endfor
 
 
-# A malformed modifier should be detected and skip the body of the loop.
-#
-# XXX: As of 2020-12-31, Var_Subst doesn't report any errors, therefore
-# the loop body is expanded as if no error had happened.
+# An error in the items skips the body of the loop.
 # expect+1: Unknown modifier ":Z"
 .for i in 1 2 ${:U3:Z} 4
-# expect+3: warning: Should not be reached.
-# expect+2: warning: Should not be reached.
-# expect+1: warning: Should not be reached.
-.  warning Should not be reached.
+.  error
 .endfor

Index: src/usr.bin/make/unit-tests/directive-for.exp
diff -u src/usr.bin/make/unit-tests/directive-for.exp:1.28 src/usr.bin/make/unit-tests/directive-for.exp:1.29
--- src/usr.bin/make/unit-tests/directive-for.exp:1.28	Sun Mar 30 09:51:50 2025
+++ src/usr.bin/make/unit-tests/directive-for.exp	Sun Mar 30 16:43:10 2025
@@ -17,18 +17,13 @@ make: directive-for.mk:158: }{ }{ }{
 make: directive-for.mk:166: invalid character ':' in .for loop variable name
 make: directive-for.mk:173: invalid character '$' in .for loop variable name
 make: directive-for.mk:185: invalid character '$' in .for loop variable name
-make: directive-for.mk:210: Unknown modifier ":Z"
-	while evaluating "${:Uword2:Z}-after word3" with value "word2"
-make: directive-for.mk:214: XXX: Should not reach word1
-make: directive-for.mk:214: XXX: Should not reach before--after
-make: directive-for.mk:214: XXX: Should not reach word3
-make: directive-for.mk:219: no iteration variables in for
-make: directive-for.mk:245: 1 open conditional
-	in .for loop from directive-for.mk:243 with var = value
-make: directive-for.mk:261: for-less endfor
-make: directive-for.mk:262: if-less endif
-make: directive-for.mk:270: if-less endif
-	in .for loop from directive-for.mk:269 with var = value
+make: directive-for.mk:207: no iteration variables in for
+make: directive-for.mk:233: 1 open conditional
+	in .for loop from directive-for.mk:231 with var = value
+make: directive-for.mk:249: for-less endfor
+make: directive-for.mk:250: if-less endif
+make: directive-for.mk:258: if-less endif
+	in .for loop from directive-for.mk:257 with var = value
 For: new loop 2
 For: end for 2
 For: end for 1
@@ -39,7 +34,7 @@ For: loop body with outer = o:
    endfor
 For: end for 1
 For: loop body with inner = i:
-make: directive-for.mk:319: newline-item=(a)
+make: directive-for.mk:307: newline-item=(a)
 make: Fatal errors encountered -- cannot continue
 make: stopped in unit-tests
 exit status 1

Index: src/usr.bin/make/unit-tests/directive-for.mk
diff -u src/usr.bin/make/unit-tests/directive-for.mk:1.29 src/usr.bin/make/unit-tests/directive-for.mk:1.30
--- src/usr.bin/make/unit-tests/directive-for.mk:1.29	Sat Mar 29 19:08:52 2025
+++ src/usr.bin/make/unit-tests/directive-for.mk	Sun Mar 30 16:43:10 2025
@@ -1,4 +1,4 @@
-# $NetBSD: directive-for.mk,v 1.29 2025/03/29 19:08:52 rillig Exp $
+# $NetBSD: directive-for.mk,v 1.30 2025/03/30 16:43:10 rillig Exp $
 #
 # Tests for the .for directive.
 #
@@ -203,18 +203,6 @@ INDIRECT=	${DIRECT}
 .endfor
 
 
-# XXX: A parse error or evaluation error in the items of the .for loop
-# should skip the whole loop.  As of 2023-05-09, the loop is expanded as
-# usual.
-# expect+1: Unknown modifier ":Z"
-.for var in word1 before-${:Uword2:Z}-after word3
-# expect+3: XXX: Should not reach word1
-# expect+2: XXX: Should not reach before--after
-# expect+1: XXX: Should not reach word3
-.  info XXX: Should not reach ${var}
-.endfor
-
-
 # An empty list of variables to the left of the 'in' is a parse error.
 .for in value			# expect+0: no iteration variables in for
 .  error

Index: src/usr.bin/make/unit-tests/varmod-indirect.exp
diff -u src/usr.bin/make/unit-tests/varmod-indirect.exp:1.35 src/usr.bin/make/unit-tests/varmod-indirect.exp:1.36
--- src/usr.bin/make/unit-tests/varmod-indirect.exp:1.35	Sun Mar 30 09:51:51 2025
+++ src/usr.bin/make/unit-tests/varmod-indirect.exp	Sun Mar 30 16:43:10 2025
@@ -11,13 +11,11 @@ make: varmod-indirect.mk:156: after
 make: varmod-indirect.mk:161: Unknown modifier ":Z"
 	while evaluating indirect modifiers "Z"
 	while evaluating variable "UNDEF" with value ""
-make: varmod-indirect.mk:164: before
-make: varmod-indirect.mk:164: after
-Parsing varmod-indirect.mk:173: _:=	before ${UNDEF} after
+Parsing varmod-indirect.mk:171: _:=	before ${UNDEF} after
 Global: _ = # (empty)
 Var_Parse: ${UNDEF} after (eval-keep-dollar-and-undefined)
 Global: _ = before ${UNDEF} after
-Parsing varmod-indirect.mk:176: _:=	before ${UNDEF:${:US,a,a,}} after
+Parsing varmod-indirect.mk:174: _:=	before ${UNDEF:${:US,a,a,}} after
 Var_Parse: ${UNDEF:${:US,a,a,}} after (eval-keep-dollar-and-undefined)
 Indirect modifier "S,a,a," from "${:US,a,a,}"
 Evaluating modifier ${UNDEF:S...} on value "" (eval-keep-dollar-and-undefined, undefined)
@@ -26,19 +24,19 @@ Modifier part: "a"
 ModifyWords: split "" into 1 word
 Result of ${UNDEF:S,a,a,} is "" (eval-keep-dollar-and-undefined, undefined)
 Global: _ = before ${UNDEF:S,a,a,} after
-Parsing varmod-indirect.mk:186: _:=	before ${UNDEF:${:U}} after
+Parsing varmod-indirect.mk:184: _:=	before ${UNDEF:${:U}} after
 Var_Parse: ${UNDEF:${:U}} after (eval-keep-dollar-and-undefined)
 Indirect modifier "" from "${:U}"
 Global: _ = before ${UNDEF:} after
-Parsing varmod-indirect.mk:192: _:=	before ${UNDEF:${:UZ}} after
+Parsing varmod-indirect.mk:190: _:=	before ${UNDEF:${:UZ}} after
 Var_Parse: ${UNDEF:${:UZ}} after (eval-keep-dollar-and-undefined)
 Indirect modifier "Z" from "${:UZ}"
 Evaluating modifier ${UNDEF:Z} on value "" (eval-keep-dollar-and-undefined, undefined)
-make: varmod-indirect.mk:192: Unknown modifier ":Z"
+make: varmod-indirect.mk:190: Unknown modifier ":Z"
 	while evaluating indirect modifiers "Z"
 	while evaluating variable "UNDEF" with value ""
 Global: _ = before ${UNDEF:Z} after
-Parsing varmod-indirect.mk:194: .MAKEFLAGS: -d0
+Parsing varmod-indirect.mk:192: .MAKEFLAGS: -d0
 ParseDependency(.MAKEFLAGS: -d0)
 Global: .MAKEFLAGS =  -r -k -d 0 -d pv -d
 Global: .MAKEFLAGS =  -r -k -d 0 -d pv -d 0

Index: src/usr.bin/make/unit-tests/varmod-indirect.mk
diff -u src/usr.bin/make/unit-tests/varmod-indirect.mk:1.23 src/usr.bin/make/unit-tests/varmod-indirect.mk:1.24
--- src/usr.bin/make/unit-tests/varmod-indirect.mk:1.23	Sat Mar 29 19:08:52 2025
+++ src/usr.bin/make/unit-tests/varmod-indirect.mk	Sun Mar 30 16:43:10 2025
@@ -1,4 +1,4 @@
-# $NetBSD: varmod-indirect.mk,v 1.23 2025/03/29 19:08:52 rillig Exp $
+# $NetBSD: varmod-indirect.mk,v 1.24 2025/03/30 16:43:10 rillig Exp $
 #
 # Tests for indirect variable modifiers, such as in ${VAR:${M_modifiers}}.
 # These can be used for very basic purposes like converting a string to either
@@ -159,9 +159,7 @@ M_NoPrimes=	${PRIMES:${M_ListToSkip}}
 # An error in an indirect modifier.
 # expect+1: Unknown modifier ":Z"
 .for var in before ${UNDEF:${:UZ}} after
-# expect+2: before
-# expect+1: after
-.  info ${var}
+.  error
 .endfor
 
 

Reply via email to