[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