[Fortran, Patch, PR51815, v3] Fix parsing of substring refs in coarrays.
Harald Anlauf
anlauf@gmx.de
Mon Oct 7 20:58:23 GMT 2024
Hi Andre,
On 10/7/24 11:04, Andre Vehreschild wrote:
> Hi Harald,
>
> thank you for your input. I still have some small nits to discuss to make
> everyone happy. Therefore:
>
>> this seems to go into the right direction - except that I am not a
>> great fan of gfc_error_now, as that tries to paper over deficiencies
>> in error recovery.
>
> Me either, but when I remove the gfc_error_now() and only do
>
>> if (gfc_peek_ascii_char () == '(')
>> return MATCH_ERROR;
>
> as you proposed, then no error is given for:
>
> character(:), allocatable :: x[:]
> character(:), allocatable :: c
> c = x(:)(2:5)
>
> I.e. nothing at all.
hmmm, without the hunk in question I do get:
4 | c = x(:)(2:5)
| 1
Error: Unclassifiable statement at (1)
which is the same when doing a return MATCH_ERROR;
When I simply use:
if (gfc_peek_ascii_char () == '(')
{
gfc_error ("Unexpected array/substring ref at %C");
return MATCH_ERROR;
}
this already generates:
4 | c = x(:)(2:5)
| 1
Error: Unexpected array/substring ref at (1)
> Therefore at the moment I prefer to stick to the initial> solution
with the gfc_error_now, which not only gives an error in the
> associate, but also when one just does an array/substring-ref outside of
> parentheses. And I like the new error message, because I consider it more
> helpful than just a syntax error or the invalid association target message.
> What do you think?
The motivation for my asking is based on the following naive thinking
(assuming that x is of type character):
x(:)(2:5) ! could be a rank mismatch when x is an array
x[1](:)(2:5) ! is always a syntax error
x(:)[1](2:5) ! could by diagnosed as a rank mismatch
That is of course wishful thinking on my side. No compiler
matches this completely, and diagnosing a syntax error is
certainly acceptable behavior. (Some other brand shows funny
diagnostics coming likely from the resolution phase).
>> Is there a reason that you do not check the return value of
>> gfc_match_array_ref?
>
> What am I to do with the result? We are in an error case independent of the
> result of gfc_match_array_ref. The intention of using that routine here was to
> digest the unexpected input and allow for (easier|better) error recovery.
Do you have an example that shows the use of gfc_match_array_ref here?
Commenting it out doesn't seem to make a difference in the error case
here, unless I missed something.
> May> be I should just put a comment on it, to make it more clear. Or
is there
> another way to help the parser recover from an error?
Well, I am not the expert to answer that. Without gfc_error_now,
we're more likely seeing errors coming from the parsing of the
associate, and here I would point to Paul as the one with the most
experience. I would hope that the parsing of associate would see
if an error was issued for the associate target and allow that error
to be emitted.
> Sorry for the additional round. But this error has been around for so long,
> that it doesn't matter, if we need another day to come up with a solution.
Indeed! :-)
> Regtests ok on x86_64-pc-linux-gnu / Fedora 39. Ok for mainline?
I am fine with your solution. Diagnostics can be improved later
any time...
> Regards,
> Andre
Thanks for your patience!
Harald
>
>> Indeed your suggestion (or the shortened version above) improves
>> the diagnostics ("user experience") also for this variant:
>>
>> subroutine foo
>> character(:), allocatable :: x[:]
>> character(:), dimension(:), allocatable :: c[:]
>> type t
>> character(:), allocatable :: x[:]
>> character(:), dimension(:), allocatable :: c[:]
>> end type t
>> type(t) :: z
>> associate (y => x(:)(2:))
>> end associate
>> associate (a => c(:)(:)(2:))
>> end associate
>> associate (y => z%x(:)(2:))
>> end associate
>> associate (a => z%c(:)(:)(2:))
>> end associate
>> end
>>
>> with several error messages of the kind
>>
>> Error: Invalid association target at (1)
>>
>> or
>>
>> Error: Rank mismatch in array reference at (1) (1/0)
>>
>> looking less technical than a parsing error.
>> I think this is as good as it can be.
>>
>> So OK from my side with either your additional patch or my
>> shortened version.
>>
>> Thanks for the patch!
>>
>> Harald
>>
>>
>>> Regtests ok on x86_64-pc-linux-gnu / Fedora 39. Is this ok?
>>>
>>> Regards and thanks for the review,
>>> Andre
>>>
>>> On Tue, 1 Oct 2024 23:31:11 +0200
>>> Harald Anlauf <anlauf@gmx.de> wrote:
>>>
>>>> Hi Andre,
>>>>
>>>> Am 01.10.24 um 09:43 schrieb Andre Vehreschild:
>>>>> Hi all,
>>>>>
>>>>> this rather old PR reported a parsing bug, when a coarray'ed character
>>>>> substring ref is to be parsed, aka CHARACTER(:) :: str[:] ... str(2:5). In
>>>>> this case the parser confused the substring ref with an array-ref, because
>>>>> an array_spec was present. This patch fixes this by requesting only
>>>>> coarray parsing from gfc_match_array_ref when no regular dimension is
>>>>> present. The patch is not involved when an array of coarray'ed strings is
>>>>> parsed (that worked beforehand).
>>>>
>>>> while the patch addresses the issue mentioned in the PR,
>>>>
>>>>> I had to fix the dg-error clauses in the testcase pr102532 because now the
>>>>> error of having to many refs is detected by the parsing stage and no
>>>>> longer by the resolve stage. It has become a simple syntax error. I hope
>>>>> this is ok.
>>>>
>>>> I find the error messages now less helpful to users: before the patch
>>>> we got "Rank mismatch in array reference", which was more suitable
>>>> than the newer version with more or less confusing syntax errors.
>>>>
>>>> I assume you tried to find a better solution - but Intel and NAG
>>>> also give syntax errors - so basically I am fine with the patch.
>>>>
>>>> You may want to wait for a second opinion. If nobody else responds
>>>> within the next 2 days, you may proceed nevertheless.
>>>>
>>>> Thanks,
>>>> Harald
>>>>
>>>>> Regtests ok on x86_64-pc-linux-gnu / Fedora 39. Ok for mainline?
>>>>>
>>>>> Regards,
>>>>> Andre
>>>>> --
>>>>> Andre Vehreschild * Email: vehre ad gmx dot de
>>>>
>>>
>>>
>>> --
>>> Andre Vehreschild * Email: vehre ad gmx dot de
>>>
>>
>
>
> --
> Andre Vehreschild * Email: vehre ad gmx dot de
More information about the Fortran
mailing list