[Bug fortran/105916] gfortran -fdiagnostics-format=json yields incorrect output
dmalcolm at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Sun Jun 12 16:18:57 GMT 2022
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105916
David Malcolm <dmalcolm at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
Ever confirmed|0 |1
Last reconfirmed| |2022-06-12
--- Comment #2 from David Malcolm <dmalcolm at gcc dot gnu.org> ---
With the default diagnostic output format, for this error it looks like
gfc_error_opt uses a "buffered_p" global; the message is written to a
pp_error_buffer, rather than the diagnostic context's regular pretty printer.
The buffering is enabled here:
(gdb) bt
#0 gfc_buffer_error (flag=true) at ../../src/gcc/fortran/error.cc:120
#1 0x0000000000b725f7 in next_statement () at
../../src/gcc/fortran/parse.cc:1611
#2 0x0000000000b7af20 in gfc_parse_file () at
../../src/gcc/fortran/parse.cc:6738
#3 0x0000000000be3143 in gfc_be_parse_file () at
../../src/gcc/fortran/f95-lang.cc:229
#4 0x0000000001523847 in compile_file () at ../../src/gcc/toplev.cc:452
#5 0x0000000001527367 in do_compile (no_backend=false) at
../../src/gcc/toplev.cc:2144
#6 0x00000000015277f9 in toplev::main (this=0x7fffffffde6a, argc=14,
argv=0x7fffffffdf78) at ../../src/gcc/toplev.cc:2296
#7 0x0000000002e4ab76 in main (argc=14, argv=0x7fffffffdf78) at
../../src/gcc/main.cc:39
#1 0x0000000000b725f7 in next_statement () at
../../src/gcc/fortran/parse.cc:1611
1611 gfc_buffer_error (true);
(gdb) list
1606 gfc_current_ns->old_equiv = gfc_current_ns->equiv;
1607 gfc_current_ns->old_data = gfc_current_ns->data;
1608 for (;;)
1609 {
1610 gfc_statement_label = NULL;
1611 gfc_buffer_error (true); <<<<<< BUFFERING ENABLED HERE
1612
1613 if (gfc_at_eol ())
1614 gfc_advance_line ();
1615
1616 gfc_skip_comments ();
1617
1618 if (gfc_at_end ())
1619 {
1620 st = ST_NONE;
1621 break;
1622 }
1623
1624 if (gfc_define_undef_line ())
1625 continue;
1626
1627 old_locus = gfc_current_locus;
1628
1629 st = (gfc_current_form == FORM_FIXED) ? next_fixed () : next_free
();
1630
1631 if (st != ST_NONE)
1632 break;
1633 }
1634
1635 gfc_buffer_error (false); <<<<<< BUFFERING DISABLED HERE
The output handling for json/sarif doesn't know about this fortran-specific
buffered_p thing, hence these buffered errors get erroneously added to the
JSON/SARIF output.
More information about the Gcc-bugs
mailing list