On 25 September 2015 at 23:15, David Malcolm <dmalc...@redhat.com> wrote: > My recollection is that I saw that the Fortran frontend has logic for > calling into diagnostic_print_caret_line, noticed that the fortran > testsuite has dg- assertions about finding specific messages, and I got > worried that they embed assumptions about how the old printer worked. > Hence I wanted to avoid touching that for the first version, and so in > this patch it's a hybrid of the old Fortran printing code with the new > representation for multiple locations.
It is quite simple, one you understand the logic. Fortran has three types of output: (a) # [name]:[locus]: # # some code # 1 # Error: Some error at (1) which can call the same function used by other FEs to print the caret line (I call the caret line, the line that contains the caret character/ranges, 1 in this case). (b) # [name]:[locus]: # # some code and some more code # 1 2 # Error: Some error at (1) and (2) which according to what you explained should also be possible by calling diagnostic_show_locus with the appropriate location info and (c) # [name]:[locus]: # # some code # 1 # [name]:[locus2]: # # some other code # 2 # Error: Some error at (1) and (2) # or which was implemented by calling diagnostic_show_locus with just the location of 1, then calling diagnostic_print_caret_line with just the expanded_location of 2. I could have just called diagnostic_show_locus also to print 2 by overriding diagnostic->location[0] = diagnostic->location[1] and caret_char[0] = caret_char[1], but that seemed a bit hackish and more expensive (but perhaps less confusing?). If you have a function that you can call with one or more location_t/expanded_location (or something that can be converted from a location_t) and pass explicitly the caret_char, then you just need to call that function with the right parameters to get the second part of (c). Otherwise, you may simply temporarily do caret_char[0] = caret_char[1], before calling the same function that prints the caret-line for (a). > Maybe that's a cop-out. Would you prefer that the patch goes all the > way, and that I attempt to eliminate all calls to > diagnostic_print_caret_line from the Fortran FE, and eliminate the old > implementation? (either now, or as a followup patch?) I may need > assistance with that; I suspect that some of the dg- assertions in the > Fortran test suite may need updating. There is only one call! I just think this hack is really not necessary (in fact, it seems more complicated than the alternatives outlined above). And I'm afraid that once it goes in, it will stay there forever. You are in a far better position than the Fortran devs to understand how to call your new interfaces to get the output you desire. Cheers, Manuel.