Module Name: src Committed By: rillig Date: Sat Jan 8 20:21:34 UTC 2022
Modified Files: src/usr.bin/make: for.c nonints.h parse.c src/usr.bin/make/unit-tests: cond-token-plain.exp cond-token-string.exp directive-for.exp directive-info.exp directive-info.mk directive-undef.exp opt-debug-parse.exp varmod-indirect.exp varmod-indirect.mk Log Message: make: fix reported line numbers of continuation lines (since 2002) Previously, multi-line directives like '.info' or '.error' reported the line number of their last line instead of their first line, which is more usual. This also affected the debug log from '-dp'. To generate a diff of this commit: cvs rdiff -u -r1.159 -r1.160 src/usr.bin/make/for.c cvs rdiff -u -r1.233 -r1.234 src/usr.bin/make/nonints.h cvs rdiff -u -r1.638 -r1.639 src/usr.bin/make/parse.c cvs rdiff -u -r1.14 -r1.15 src/usr.bin/make/unit-tests/cond-token-plain.exp cvs rdiff -u -r1.6 -r1.7 src/usr.bin/make/unit-tests/cond-token-string.exp \ src/usr.bin/make/unit-tests/directive-info.exp cvs rdiff -u -r1.11 -r1.12 src/usr.bin/make/unit-tests/directive-for.exp cvs rdiff -u -r1.8 -r1.9 src/usr.bin/make/unit-tests/directive-info.mk cvs rdiff -u -r1.7 -r1.8 src/usr.bin/make/unit-tests/directive-undef.exp cvs rdiff -u -r1.2 -r1.3 src/usr.bin/make/unit-tests/opt-debug-parse.exp cvs rdiff -u -r1.20 -r1.21 src/usr.bin/make/unit-tests/varmod-indirect.exp cvs rdiff -u -r1.9 -r1.10 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.159 src/usr.bin/make/for.c:1.160 --- src/usr.bin/make/for.c:1.159 Sat Jan 8 17:25:19 2022 +++ src/usr.bin/make/for.c Sat Jan 8 20:21:34 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: for.c,v 1.159 2022/01/08 17:25:19 rillig Exp $ */ +/* $NetBSD: for.c,v 1.160 2022/01/08 20:21:34 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.159 2022/01/08 17:25:19 rillig Exp $"); +MAKE_RCSID("$NetBSD: for.c,v 1.160 2022/01/08 20:21:34 rillig Exp $"); typedef struct ForLoop { @@ -469,7 +469,7 @@ For_NextIteration(ForLoop *f, Buffer *bo /* Run the .for loop, imitating the actions of an include file. */ void -For_Run(int lineno) +For_Run(int headLineno, int bodyReadLines) { Buffer buf; ForLoop *f = accumFor; @@ -477,7 +477,7 @@ For_Run(int lineno) if (f->items.len > 0) { Buf_Init(&buf); - Parse_PushInput(NULL, lineno, buf, f); + Parse_PushInput(NULL, headLineno, bodyReadLines, buf, f); } else ForLoop_Free(f); } Index: src/usr.bin/make/nonints.h diff -u src/usr.bin/make/nonints.h:1.233 src/usr.bin/make/nonints.h:1.234 --- src/usr.bin/make/nonints.h:1.233 Fri Jan 7 20:54:45 2022 +++ src/usr.bin/make/nonints.h Sat Jan 8 20:21:34 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: nonints.h,v 1.233 2022/01/07 20:54:45 rillig Exp $ */ +/* $NetBSD: nonints.h,v 1.234 2022/01/08 20:21:34 rillig Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1993 @@ -119,7 +119,7 @@ void SearchPath_Free(SearchPath *); struct ForLoop; int For_Eval(const char *) MAKE_ATTR_USE; bool For_Accum(const char *, int *) MAKE_ATTR_USE; -void For_Run(int); +void For_Run(int, int); bool For_NextIteration(struct ForLoop *, Buffer *); /* job.c */ @@ -147,7 +147,7 @@ void Parse_Error(ParseErrorLevel, const bool Parse_VarAssign(const char *, bool, GNode *) MAKE_ATTR_USE; void Parse_AddIncludeDir(const char *); void Parse_File(const char *, int); -void Parse_PushInput(const char *, int, Buffer, struct ForLoop *); +void Parse_PushInput(const char *, int, int, Buffer, struct ForLoop *); void Parse_MainName(GNodeList *); int Parse_NumErrors(void) MAKE_ATTR_USE; Index: src/usr.bin/make/parse.c diff -u src/usr.bin/make/parse.c:1.638 src/usr.bin/make/parse.c:1.639 --- src/usr.bin/make/parse.c:1.638 Sat Jan 8 09:55:32 2022 +++ src/usr.bin/make/parse.c Sat Jan 8 20:21:34 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: parse.c,v 1.638 2022/01/08 09:55:32 rillig Exp $ */ +/* $NetBSD: parse.c,v 1.639 2022/01/08 20:21:34 rillig Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1993 @@ -106,26 +106,20 @@ #include "pathnames.h" /* "@(#)parse.c 8.3 (Berkeley) 3/19/94" */ -MAKE_RCSID("$NetBSD: parse.c,v 1.638 2022/01/08 09:55:32 rillig Exp $"); +MAKE_RCSID("$NetBSD: parse.c,v 1.639 2022/01/08 20:21:34 rillig Exp $"); /* * A file being read. */ typedef struct IncludedFile { FStr name; /* absolute or relative to the cwd */ - /* TODO: add lineno for accurate line number information */ + int lineno; /* 1-based */ int readLines; /* the number of physical lines that have - * been read from the file; for lines without - * backslash continuation, it coincidentally - * equals the 1-based human-readable line - * number for messages */ - /* TODO: add forHeadLineno for accurate line number information */ + * been read from the file */ + int forHeadLineno; /* 1-based */ int forBodyReadLines; /* the number of physical lines that have * been read from the file above the body of - * the .for loop; in .for loops whose head - * fits in a single line, it coincidentally - * equals the 1-based human-readable line - * number for messages */ + * the .for loop */ unsigned int cond_depth; /* 'if' nesting when file opened */ bool depending; /* state of doing_depend on EOF */ @@ -359,20 +353,12 @@ PrintStackTrace(void) if (fname[0] != '/' && strcmp(fname, "(stdin)") != 0) fname = realpath(fname, dirbuf); - /* - * FIXME: Using readLines is incorrect for multi-line - * .include directives. - */ if (entries[i + 1 < n ? i + 1 : i].forLoop == NULL) debug_printf("\tin .include from %s:%d\n", - fname, entry->readLines - 1 + 1); - /* - * FIXME: Using forBodyReadLines is incorrect for multi-line - * .for directives. - */ + fname, entry->lineno); if (entry->forLoop != NULL) debug_printf("\tin .for loop from %s:%d\n", - fname, entry->forBodyReadLines - 1 + 1); + fname, entry->forHeadLineno); } } @@ -395,8 +381,7 @@ RememberLocation(GNode *gn) { IncludedFile *curFile = CurFile(); gn->fname = Str_Intern(curFile->name.str); - /* FIXME: mismatch between lineno and readLines */ - gn->lineno = curFile->readLines; + gn->lineno = curFile->lineno; } /* @@ -521,8 +506,7 @@ Parse_Error(ParseErrorLevel type, const } else { IncludedFile *curFile = CurFile(); fname = curFile->name.str; - /* FIXME: mismatch between lineno and readLines */ - lineno = (size_t)curFile->readLines; + lineno = (size_t)curFile->lineno; } (void)fflush(stdout); @@ -1921,7 +1905,7 @@ IncludeFile(const char *file, bool isSys buf = loadfile(fullname, fd); (void)close(fd); - Parse_PushInput(fullname, 0, buf, NULL); + Parse_PushInput(fullname, 1, 0, buf, NULL); if (depinc) doing_depend = depinc; /* only turn it on */ free(fullname); @@ -2097,7 +2081,7 @@ TrackInput(const char *name) /* Parse from the given buffer, later return to the current file. */ void -Parse_PushInput(const char *name, int lineno, Buffer buf, +Parse_PushInput(const char *name, int lineno, int readLines, Buffer buf, struct ForLoop *forLoop) { IncludedFile *curFile; @@ -2112,10 +2096,10 @@ Parse_PushInput(const char *name, int li curFile = Vector_Push(&includes); curFile->name = FStr_InitOwn(bmake_strdup(name)); - /* FIXME: mismatch between readLines and lineno */ - curFile->readLines = lineno; - /* FIXME: mismatch between readLines and lineno */ - curFile->forBodyReadLines = lineno; + curFile->lineno = lineno; + curFile->readLines = readLines; + curFile->forHeadLineno = lineno; + curFile->forBodyReadLines = readLines; curFile->buf = buf; curFile->depending = doing_depend; /* restore this on EOF */ curFile->forLoop = forLoop; @@ -2278,9 +2262,8 @@ ParseEOF(void) } curFile = CurFile(); - /* FIXME: mismatch between lineno and readLines */ DEBUG2(PARSE, "ParseEOF: returning to file %s, line %d\n", - curFile->name.str, curFile->readLines); + curFile->name.str, curFile->lineno); SetParseFile(curFile->name.str); return true; @@ -2450,13 +2433,15 @@ static char * ReadLowLevelLine(LineKind kind) { IncludedFile *curFile = CurFile(); + ParseRawLineResult res; char *line; char *line_end; char *firstBackslash; char *commentLineEnd; for (;;) { - ParseRawLineResult res = ParseRawLine(curFile, + curFile->lineno = curFile->readLines + 1; + res = ParseRawLine(curFile, &line, &line_end, &firstBackslash, &commentLineEnd); if (res == PRLR_ERROR) return NULL; @@ -2517,20 +2502,20 @@ static bool ParseForLoop(const char *line) { int rval; - int firstLineno; + int forHeadLineno; + int bodyReadLines; int forLevel; + forHeadLineno = CurFile()->lineno; rval = For_Eval(line); if (rval == 0) return false; /* Not a .for line */ if (rval < 0) return true; /* Syntax error - error printed, ignore line */ - /* FIXME: mismatch between lineno and readLines */ - firstLineno = CurFile()->readLines; - /* Accumulate the loop body until the matching '.endfor'. */ forLevel = 1; + bodyReadLines = CurFile()->readLines; do { line = ReadLowLevelLine(LK_FOR_BODY); if (line == NULL) { @@ -2540,7 +2525,7 @@ ParseForLoop(const char *line) } } while (For_Accum(line, &forLevel)); - For_Run(firstLineno); + For_Run(forHeadLineno, bodyReadLines); return true; } @@ -2859,13 +2844,12 @@ Parse_File(const char *name, int fd) assert(targets == NULL); - Parse_PushInput(name, 0, buf, NULL); + Parse_PushInput(name, 1, 0, buf, NULL); do { while ((line = ReadHighLevelLine()) != NULL) { - /* FIXME: mismatch between lineno and readLines */ DEBUG2(PARSE, "Parsing line %d: %s\n", - CurFile()->readLines, line); + CurFile()->lineno, line); ParseLine(line); } /* Reached EOF, but it may be just EOF of an include file. */ Index: src/usr.bin/make/unit-tests/cond-token-plain.exp diff -u src/usr.bin/make/unit-tests/cond-token-plain.exp:1.14 src/usr.bin/make/unit-tests/cond-token-plain.exp:1.15 --- src/usr.bin/make/unit-tests/cond-token-plain.exp:1.14 Thu Dec 30 02:14:55 2021 +++ src/usr.bin/make/unit-tests/cond-token-plain.exp Sat Jan 8 20:21:34 2022 @@ -27,7 +27,7 @@ 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 106: A bare word is treated like defined(...), and the variable 'bare' is not defined. +make: "cond-token-plain.mk" line 105: A bare word is treated like defined(...), and the variable 'bare' is not defined. CondParser_Eval: VAR make: "cond-token-plain.mk" line 111: A bare word is treated like defined(...). CondParser_Eval: V${:UA}R Index: src/usr.bin/make/unit-tests/cond-token-string.exp diff -u src/usr.bin/make/unit-tests/cond-token-string.exp:1.6 src/usr.bin/make/unit-tests/cond-token-string.exp:1.7 --- src/usr.bin/make/unit-tests/cond-token-string.exp:1.6 Tue Feb 23 15:19:41 2021 +++ src/usr.bin/make/unit-tests/cond-token-string.exp Sat Jan 8 20:21:34 2022 @@ -6,9 +6,9 @@ make: "cond-token-string.mk" line 37: Ex CondParser_Eval: "UNDEF" make: "cond-token-string.mk" line 46: The string literal "UNDEF" is not empty. CondParser_Eval: " " -make: "cond-token-string.mk" line 55: The string literal " " is not empty, even though it consists of whitespace only. +make: "cond-token-string.mk" line 54: The string literal " " is not empty, even though it consists of whitespace only. CondParser_Eval: "${UNDEF}" -make: "cond-token-string.mk" line 64: An undefined variable in quotes expands to an empty string, which then evaluates to false. +make: "cond-token-string.mk" line 63: An undefined variable in quotes expands to an empty string, which then evaluates to false. CondParser_Eval: "${:Uvalue}" make: "cond-token-string.mk" line 68: A nonempty variable expression evaluates to true. CondParser_Eval: "${:U}" Index: src/usr.bin/make/unit-tests/directive-info.exp diff -u src/usr.bin/make/unit-tests/directive-info.exp:1.6 src/usr.bin/make/unit-tests/directive-info.exp:1.7 --- src/usr.bin/make/unit-tests/directive-info.exp:1.6 Sat Dec 19 22:33:11 2020 +++ src/usr.bin/make/unit-tests/directive-info.exp Sat Jan 8 20:21:34 2022 @@ -9,7 +9,7 @@ make: "directive-info.mk" line 22: Missi make: "directive-info.mk" line 23: Missing argument for ".info" make: "directive-info.mk" line 26: Unknown directive "info-message" make: "directive-info.mk" line 27: no-target: no-source -make: "directive-info.mk" line 36: expect line 30 for multi-line message +make: "directive-info.mk" line 35: expect line 35 for multi-line message make: Fatal errors encountered -- cannot continue make: stopped in unit-tests exit status 1 Index: src/usr.bin/make/unit-tests/directive-for.exp diff -u src/usr.bin/make/unit-tests/directive-for.exp:1.11 src/usr.bin/make/unit-tests/directive-for.exp:1.12 --- src/usr.bin/make/unit-tests/directive-for.exp:1.11 Sat Jan 8 10:22:03 2022 +++ src/usr.bin/make/unit-tests/directive-for.exp Sat Jan 8 20:21:34 2022 @@ -36,7 +36,7 @@ make: "directive-for.mk" line 229: Unexp For: loop body: .\ endfor -make: "directive-for.mk" line 228: for-less endfor +make: "directive-for.mk" line 227: for-less endfor make: Fatal errors encountered -- cannot continue make: stopped in unit-tests exit status 1 Index: src/usr.bin/make/unit-tests/directive-info.mk diff -u src/usr.bin/make/unit-tests/directive-info.mk:1.8 src/usr.bin/make/unit-tests/directive-info.mk:1.9 --- src/usr.bin/make/unit-tests/directive-info.mk:1.8 Sat Dec 19 22:33:11 2020 +++ src/usr.bin/make/unit-tests/directive-info.mk Sat Jan 8 20:21:34 2022 @@ -1,4 +1,4 @@ -# $NetBSD: directive-info.mk,v 1.8 2020/12/19 22:33:11 rillig Exp $ +# $NetBSD: directive-info.mk,v 1.9 2022/01/08 20:21:34 rillig Exp $ # # Tests for the .info directive. # @@ -27,11 +27,12 @@ .info no-target: no-source # This is a .info directive, not a dependency. # See directive.mk for more tests of this kind. -# Since at least 2002-01-01, the line number that is used in error messages -# and the .info directives is the number of completely read lines. For the -# following multi-line directive, this means that the reported line number is -# the one of the last line, not the first line. -.info expect line 30 for\ +# Since at least 2002-01-01 and before parse.c 1.639 from 2022-01-08, the line +# number that is used in error messages and the .info directives was the +# number of completely read lines. For the following multi-line directive, +# this meant that the reported line number was the one of the last line, not +# of the first line. +.info expect line 35 for\ multi$\ -line message Index: src/usr.bin/make/unit-tests/directive-undef.exp diff -u src/usr.bin/make/unit-tests/directive-undef.exp:1.7 src/usr.bin/make/unit-tests/directive-undef.exp:1.8 --- src/usr.bin/make/unit-tests/directive-undef.exp:1.7 Tue Feb 23 15:19:41 2021 +++ src/usr.bin/make/unit-tests/directive-undef.exp Sat Jan 8 20:21:34 2022 @@ -1,6 +1,6 @@ make: "directive-undef.mk" line 29: The .undef directive requires an argument make: "directive-undef.mk" line 86: Unknown modifier "Z" -make: "directive-undef.mk" line 103: warning: UT_EXPORTED is still listed in .MAKE.EXPORTED even though spaceit is not exported anymore. +make: "directive-undef.mk" line 102: warning: UT_EXPORTED is still listed in .MAKE.EXPORTED even though spaceit is not exported anymore. make: Fatal errors encountered -- cannot continue make: stopped in unit-tests exit status 1 Index: src/usr.bin/make/unit-tests/opt-debug-parse.exp diff -u src/usr.bin/make/unit-tests/opt-debug-parse.exp:1.2 src/usr.bin/make/unit-tests/opt-debug-parse.exp:1.3 --- src/usr.bin/make/unit-tests/opt-debug-parse.exp:1.2 Sun Jan 2 03:23:55 2022 +++ src/usr.bin/make/unit-tests/opt-debug-parse.exp Sat Jan 8 20:21:34 2022 @@ -1,4 +1,4 @@ -Parse_PushInput: .for loop in opt-debug-parse.mk, line 16 +Parse_PushInput: .for loop in opt-debug-parse.mk, line 13 SetFilenameVars: ${.PARSEDIR} = `<curdir>' ${.PARSEFILE} = `opt-debug-parse.mk' Parsing line 17: .info trace with multi-line .for loop head make: "opt-debug-parse.mk" line 17: trace with multi-line .for loop head Index: src/usr.bin/make/unit-tests/varmod-indirect.exp diff -u src/usr.bin/make/unit-tests/varmod-indirect.exp:1.20 src/usr.bin/make/unit-tests/varmod-indirect.exp:1.21 --- src/usr.bin/make/unit-tests/varmod-indirect.exp:1.20 Tue Dec 28 15:49:00 2021 +++ src/usr.bin/make/unit-tests/varmod-indirect.exp Sat Jan 8 20:21:34 2022 @@ -1,6 +1,6 @@ make: "varmod-indirect.mk" line 19: Unknown modifier "${" make: "varmod-indirect.mk" line 52: Unknown modifier "${" -make: "varmod-indirect.mk" line 55: warning: FIXME: this expression should have resulted in a parse error rather than returning the unparsed portion of the expression. +make: "varmod-indirect.mk" line 53: warning: FIXME: this expression should have resulted in a parse error rather than returning the unparsed portion of the expression. make: "varmod-indirect.mk" line 140: before make: "varmod-indirect.mk" line 140: after make: "varmod-indirect.mk" line 146: before Index: src/usr.bin/make/unit-tests/varmod-indirect.mk diff -u src/usr.bin/make/unit-tests/varmod-indirect.mk:1.9 src/usr.bin/make/unit-tests/varmod-indirect.mk:1.10 --- src/usr.bin/make/unit-tests/varmod-indirect.mk:1.9 Mon Mar 15 20:00:50 2021 +++ src/usr.bin/make/unit-tests/varmod-indirect.mk Sat Jan 8 20:21:34 2022 @@ -1,4 +1,4 @@ -# $NetBSD: varmod-indirect.mk,v 1.9 2021/03/15 20:00:50 rillig Exp $ +# $NetBSD: varmod-indirect.mk,v 1.10 2022/01/08 20:21:34 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 @@ -47,7 +47,7 @@ # error. Because of this parse error, this feature cannot be used reasonably # in practice. # -# expect+1: Unknown modifier '$' +# expect+2: Unknown modifier '$' #.MAKEFLAGS: -dvc .if ${value:L:${:UM*}S,value,replaced,} == "M*S,value,replaced,}" . warning FIXME: this expression should have resulted in a parse $\