Hi Harald, I agree that the gfc_match_array_ref() is not needed for error recovery or helps anyhow. I therefore removed it. I left the new error message in, because in the case that c = x(:)(2:5) is in a subroutine, like in pr102532.f90, then I get no error. Neither without return MATCH_ERROR nor with it. Therefore I think the gfc_error_now() can help.
I have bootstrapped and regtested the modified patch again on x86_64-pc-linux-gnu / Fedora 39 before committing it as: gcc-15-4171-g0ad2c76bea2 Thanks for the review and the fruitful discussion. I hope that this solution will fix the bug and also improve gfortran's user experience a tiny little bit. Thanks again and regards, Andre On Mon, 7 Oct 2024 22:58:23 +0200 Harald Anlauf <anl...@gmx.de> wrote: > 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 <anl...@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 > -- Andre Vehreschild * Email: vehre ad gmx dot de