On Sun, Sep 13, 2026, at 7:48 AM, Jose E. Marchesi wrote: > Hello Pietro. > Thanks for the patch. > >> The scanner builds list of lines from the source code. Then it >> iterates over the list concatenating the lines that end with >> backslashes with the following line. >> >> Instead of iterating over all lines skip a backslash if it preceeds a >> newline. > > I suppose this change is motivated by having to keep the original source > physical line structure for multi-line diagnostics, right. > > Makes sense, but see a note below.
Yeah, but I never liked that function. I just never had an excuse to get rid of it before. >> gcc/algol68/ChangeLog: >> >> * a68-parser-scanner.cc (concatenate_lines): Delete. >> (read_source_file): Stop calling concatenate_lines. >> (next_char): Skip backslash at the end of lines. >> (include_files): Stop calling concatenate_lines. >> >> gcc/testsuite/ChangeLog: >> >> * algol68/compile/backslash-1.a68: New test. >> >> Signed-off-by: Pietro Monteiro <[email protected]> >> --- >> gcc/algol68/a68-parser-scanner.cc | 40 ++----------------- >> gcc/testsuite/algol68/compile/backslash-1.a68 | 6 +++ >> 2 files changed, 10 insertions(+), 36 deletions(-) >> create mode 100644 gcc/testsuite/algol68/compile/backslash-1.a68 >> >> diff --git a/gcc/algol68/a68-parser-scanner.cc >> b/gcc/algol68/a68-parser-scanner.cc >> index 30c23996dcd..8bdd2de7057 100644 >> --- a/gcc/algol68/a68-parser-scanner.cc >> +++ b/gcc/algol68/a68-parser-scanner.cc >> @@ -285,38 +285,6 @@ unworthy (LINE_T *u, char *v, char ch) >> a68_scan_error (u, v, A68 (edit_line)); >> } >> >> -/* Concatenate lines that terminate in '\' with next line. */ >> - >> -static void >> -concatenate_lines (LINE_T * top) >> -{ >> - LINE_T *q; >> - /* Work from bottom backwards. */ >> - for (q = top; q != NO_LINE && NEXT (q) != NO_LINE; FORWARD (q)) >> - ; >> - >> - for (; q != NO_LINE; BACKWARD (q)) >> - { >> - char *z = STRING (q); >> - size_t len = strlen (z); >> - >> - if (len >= 2 >> - && z[len - 2] == BACKSLASH_CHAR >> - && z[len - 1] == NEWLINE_CHAR >> - && NEXT (q) != NO_LINE >> - && STRING (NEXT (q)) != NO_TEXT) >> - { >> - z[len - 2] = '\0'; >> - len += (int) strlen (STRING (NEXT (q))); >> - z = (char *) xmalloc (len + 1); >> - a68_bufcpy (z, STRING (q), len + 1); >> - a68_bufcat (z, STRING (NEXT (q)), len + 1); >> - STRING (NEXT (q))[0] = '\0'; >> - STRING (q) = z; >> - } >> - } >> -} >> - >> /* Read source file FILENAME and make internal copy. */ >> >> static bool >> @@ -400,9 +368,6 @@ read_source_file (const char *filename) >> ? upper_postlude : supper_postlude, >> &ref_l, &line_num, "postlude"); >> >> - /* Concatenate lines that end with \. */ >> - concatenate_lines (TOP_LINE (&A68_JOB)); >> - >> /* Include files. */ >> include_files (TOP_LINE (&A68_JOB)); >> >> @@ -428,6 +393,10 @@ next_char (LINE_T **ref_l, char **ref_s, bool >> allow_typo, >> if (*ref_l == NO_LINE) >> return STOP_CHAR; >> >> + /* Skip backslash at the end of lines. */ >> + if ((*ref_s)[0] == BACKSLASH_CHAR && (*ref_s)[1] == NEWLINE_CHAR) >> + (*ref_s)++; >> + >> if ((*ref_s)[0] == NEWLINE_CHAR || (*ref_s)[0] == '\0') >> { >> /* Go to new line. */ >> @@ -1133,7 +1102,6 @@ include_files (LINE_T *top) >> /* Conclude and go find another include directive, if any. */ >> NEXT (t) = s; >> PREVIOUS (s) = t; >> - concatenate_lines (top); >> if (fclose (fp) != 0) >> gcc_unreachable (); >> make_pass = true; >> diff --git a/gcc/testsuite/algol68/compile/backslash-1.a68 >> b/gcc/testsuite/algol68/compile/backslash-1.a68 >> new file mode 100644 >> index 00000000000..e386d6e9c83 >> --- /dev/null >> +++ b/gcc/testsuite/algol68/compile/backslash-1.a68 >> @@ -0,0 +1,6 @@ >> +begin >> + string foobar = "foo bar"; >> + string fubar = "foo \ >> +ar"; > > Is the test missing a "b"? Yes. Should I move this test to the execute directory? I don’t think running it gains us much. I could also have a simpler compile test. The assert is s a bit misleading here. >> + assert (foobar = fubar) >> +end Thanks for the review, Pietro
