Module Name: src Committed By: rillig Date: Sun Dec 12 09:36:00 UTC 2021
Modified Files: src/usr.bin/make: cond.c src/usr.bin/make/unit-tests: cond-token-plain.exp cond-token-plain.mk Log Message: tests/make: refine comments for parsing and evaluating conditions To generate a diff of this commit: cvs rdiff -u -r1.301 -r1.302 src/usr.bin/make/cond.c cvs rdiff -u -r1.12 -r1.13 src/usr.bin/make/unit-tests/cond-token-plain.exp cvs rdiff -u -r1.13 -r1.14 src/usr.bin/make/unit-tests/cond-token-plain.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/cond.c diff -u src/usr.bin/make/cond.c:1.301 src/usr.bin/make/cond.c:1.302 --- src/usr.bin/make/cond.c:1.301 Sun Dec 12 08:55:28 2021 +++ src/usr.bin/make/cond.c Sun Dec 12 09:36:00 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: cond.c,v 1.301 2021/12/12 08:55:28 rillig Exp $ */ +/* $NetBSD: cond.c,v 1.302 2021/12/12 09:36:00 rillig Exp $ */ /* * Copyright (c) 1988, 1989, 1990 The Regents of the University of California. @@ -95,7 +95,7 @@ #include "dir.h" /* "@(#)cond.c 8.2 (Berkeley) 1/2/94" */ -MAKE_RCSID("$NetBSD: cond.c,v 1.301 2021/12/12 08:55:28 rillig Exp $"); +MAKE_RCSID("$NetBSD: cond.c,v 1.302 2021/12/12 09:36:00 rillig Exp $"); /* * The parsing of conditional expressions is based on this grammar: @@ -782,8 +782,11 @@ CondParser_FuncCall(CondParser *par, boo } /* - * Parse a comparison such as '${VAR} == "value"', or a simple leaf without + * Parse a comparison that neither starts with '"' nor '$', such as the + * unusual 'bare == right' or '3 == ${VAR}', or a simple leaf without * operator, which is a number, a variable expression or a string literal. + * + * TODO: Can this be merged into CondParser_Comparison? */ static Token CondParser_ComparisonOrLeaf(CondParser *par, bool doEval) Index: src/usr.bin/make/unit-tests/cond-token-plain.exp diff -u src/usr.bin/make/unit-tests/cond-token-plain.exp:1.12 src/usr.bin/make/unit-tests/cond-token-plain.exp:1.13 --- src/usr.bin/make/unit-tests/cond-token-plain.exp:1.12 Tue Sep 21 22:38:25 2021 +++ src/usr.bin/make/unit-tests/cond-token-plain.exp Sun Dec 12 09:36:00 2021 @@ -27,35 +27,35 @@ lhs = "var&&name", rhs = "var&&name", op CondParser_Eval: ${:Uvar}||name != "var||name" lhs = "var||name", rhs = "var||name", op = != CondParser_Eval: bare -make: "cond-token-plain.mk" line 102: A bare word is treated like defined(...), and the variable 'bare' is not defined. +make: "cond-token-plain.mk" line 106: A bare word is treated like defined(...), and the variable 'bare' is not defined. CondParser_Eval: VAR -make: "cond-token-plain.mk" line 107: A bare word is treated like defined(...). +make: "cond-token-plain.mk" line 111: A bare word is treated like defined(...). CondParser_Eval: V${:UA}R -make: "cond-token-plain.mk" line 114: ok +make: "cond-token-plain.mk" line 118: ok CondParser_Eval: V${UNDEF}AR -make: "cond-token-plain.mk" line 122: Undefined variables in bare words expand to an empty string. +make: "cond-token-plain.mk" line 126: Undefined variables in bare words expand to an empty string. CondParser_Eval: 0${:Ux00} -make: "cond-token-plain.mk" line 130: Numbers can be composed from literals and variable expressions. -CondParser_Eval: 0${:Ux01} make: "cond-token-plain.mk" line 134: Numbers can be composed from literals and variable expressions. +CondParser_Eval: 0${:Ux01} +make: "cond-token-plain.mk" line 138: Numbers can be composed from literals and variable expressions. CondParser_Eval: "" == -make: "cond-token-plain.mk" line 140: Missing right-hand side of operator '==' +make: "cond-token-plain.mk" line 144: Missing right-hand side of operator '==' CondParser_Eval: == "" -make: "cond-token-plain.mk" line 148: Malformed conditional (== "") +make: "cond-token-plain.mk" line 152: Malformed conditional (== "") CondParser_Eval: \\ -make: "cond-token-plain.mk" line 163: The variable '\\' is not defined. +make: "cond-token-plain.mk" line 167: The variable '\\' is not defined. CondParser_Eval: \\ -make: "cond-token-plain.mk" line 168: Now the variable '\\' is defined. +make: "cond-token-plain.mk" line 172: Now the variable '\\' is defined. CondParser_Eval: "unquoted\"quoted" != unquoted"quoted lhs = "unquoted"quoted", rhs = "unquoted"quoted", op = != CondParser_Eval: $$$$$$$$ != "" CondParser_Eval: left == right -make: "cond-token-plain.mk" line 191: Malformed conditional (left == right) +make: "cond-token-plain.mk" line 195: Malformed conditional (left == right) CondParser_Eval: ${0:?:} || left == right CondParser_Eval: 0 -make: "cond-token-plain.mk" line 197: Malformed conditional (${0:?:} || left == right) +make: "cond-token-plain.mk" line 201: Malformed conditional (${0:?:} || left == right) CondParser_Eval: left == right || ${0:?:} -make: "cond-token-plain.mk" line 202: Malformed conditional (left == right || ${0:?:}) +make: "cond-token-plain.mk" line 206: Malformed conditional (left == right || ${0:?:}) make: Fatal errors encountered -- cannot continue make: stopped in unit-tests exit status 1 Index: src/usr.bin/make/unit-tests/cond-token-plain.mk diff -u src/usr.bin/make/unit-tests/cond-token-plain.mk:1.13 src/usr.bin/make/unit-tests/cond-token-plain.mk:1.14 --- src/usr.bin/make/unit-tests/cond-token-plain.mk:1.13 Sun Dec 12 08:55:28 2021 +++ src/usr.bin/make/unit-tests/cond-token-plain.mk Sun Dec 12 09:36:00 2021 @@ -1,17 +1,18 @@ -# $NetBSD: cond-token-plain.mk,v 1.13 2021/12/12 08:55:28 rillig Exp $ +# $NetBSD: cond-token-plain.mk,v 1.14 2021/12/12 09:36:00 rillig Exp $ # # Tests for plain tokens (that is, string literals without quotes) -# in .if conditions. +# in .if conditions. These are also called bare words. .MAKEFLAGS: -dc +# The word 'value' after the '!=' is a bare word. .if ${:Uvalue} != value . error .endif -# Malformed condition since comment parsing is done in an early phase -# and removes the '#' and everything behind it long before the condition -# parser gets to see it. +# Using a '#' in a string literal in a condition leads to a malformed +# condition since comment parsing is done in an early phase and removes the +# '#' and everything after it long before the condition parser gets to see it. # # XXX: The error message is missing for this malformed condition. # The right-hand side of the comparison is just a '"', before unescaping. @@ -32,7 +33,10 @@ # in a very early parsing phase. # # See https://gnats.netbsd.org/19596 for example makefiles demonstrating the -# original problems. This workaround is probably not needed anymore. +# original problems. At that time, the parser didn't recognize the comment in +# the line '.else # comment3'. This workaround is not needed anymore since +# comments are stripped in an earlier phase. See "case '#'" in +# CondParser_Token. # # XXX: Missing error message for the malformed condition. The right-hand # side before unescaping is double-quotes, backslash, backslash.