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