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

Reply via email to