[PATCH] Implement Fortran diagnostic buffering for non-textual formats [PR105916]
Tobias Burnus
tburnus@baylibre.com
Wed Oct 23 09:03:48 GMT 2024
David Malcolm wrote:
> In order to handle various awkward parsing issues, the Fortran frontend
> implements buffering of diagnostics, so that diagnostics reported to
> global_dc can be either:
> (a) immediately issued, or
> (b) speculatively reported to global_dc, and stored in a buffer, to
> either be issued later or discarded.
...
> This patch moves responsibility for such buffering of diagnostics from
> fortran's error.cc to the diagnostic subsystem.
...
> Does this look OK from the Fortran side? The Fortran changes are
> essentially all specific to error.cc, converting from manipulations of
> output_buffer to those of diagnostic_buffer.
Yes, LGTM. (I only looked at the Fortran changes.)
Thanks,
Tobias
PS: I guess we eventually want to have in the testsuite some Fortran
SARIF tests, which for actual Fortran errors/warnings and not "just" for
#error.
> I'm hoping to get this in as I have followup work to support having e.g.
> both text *and* SARIF at once (PR other/116613), and fixing this is a
> prerequisite for that work.
>
> Thanks
> Dave
>
> gcc/ChangeLog:
> PR fortran/105916
> * diagnostic-buffer.h: New file.
...
> gcc/fortran/ChangeLog:
> PR fortran/105916
> * error.cc (pp_error_buffer, pp_warning_buffer): Convert from
> output_buffer * to diagnostic_buffer *.
> (warningcount_buffered, werrorcount_buffered): Eliminate.
> (gfc_error_buffer::gfc_error_buffer): Move constructor definition
> here, and initialize "buffer" using *global_dc.
> (gfc_output_buffer_empty_p): Delete in favor of
> diagnostic_buffer::empty_p.
> (gfc_clear_pp_buffer): Replace with...
> (gfc_clear_diagnostic_buffer): ...this, moving implementation
> details to diagnostic_context::clear_diagnostic_buffer.
> (gfc_warning): Replace buffering implementation with calls
> to global_dc->get_diagnostic_buffer and
> global_dc->set_diagnostic_buffer.
> (gfc_clear_warning): Update for renaming of gfc_clear_pp_buffer
> and elimination of warningcount_buffered and werrorcount_buffered.
> (gfc_warning_check): Replace buffering implementation with calls
> to pp_warning_buffer->empty_p and
> global_dc->flush_diagnostic_buffer.
> (gfc_error_opt): Replace buffering implementation with calls to
> global_dc->get_diagnostic_buffer and set_diagnostic_buffer.
> (gfc_clear_error): Update for renaming of gfc_clear_pp_buffer.
> (gfc_error_flag_test): Replace call to gfc_output_buffer_empty_p
> with call to diagnostic_buffer::empty_p.
> (gfc_error_check): Replace buffering implementation with calls
> to pp_error_buffer->empty_p and global_dc->flush_diagnostic_buffer.
> (gfc_move_error_buffer_from_to): Replace buffering implementation
> with usage of diagnostic_buffer.
> (gfc_free_error): Update for renaming of gfc_clear_pp_buffer.
> (gfc_diagnostics_init): Use "new" directly when creating
> pp_warning_buffer. Remove setting of m_flush_p on the two
> buffers, as this is handled by diagnostic_buffer and by
> diagnostic_text_format_buffer's constructor.
> * gfortran.h: Replace #include "pretty-print.h" for output_buffer
> with #include "diagnostic-buffer.h" for diagnostic_buffer.
> (struct gfc_error_buffer): Change type of field "buffer" from
> output_buffer to diagnostic_buffer. Move definition of constructor
> into error.cc so that it can use global_dc.
>
> gcc/testsuite/ChangeLog:
> PR fortran/105916
> * gcc.dg/plugin/diagnostic_plugin_xhtml_format.c: Include
> "diagnostic-buffer.h".
...
> * gfortran.dg/diagnostic-format-json-pr105916.F90: New test.
> * gfortran.dg/diagnostic-format-sarif-1.F90: New test.
> * gfortran.dg/diagnostic-format-sarif-1.py: New support script.
> * gfortran.dg/diagnostic-format-sarif-pr105916.f90: New test.
More information about the Fortran
mailing list