The problem is that diagnostic_action_after_output tries to delete the active
commit964f793c121e2d2bc68a29fcc1def75180f669b4
authormanu <manu@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 24 Jun 2015 22:16:42 +0000 (24 22:16 +0000)
committermanu <manu@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 24 Jun 2015 22:16:42 +0000 (24 22:16 +0000)
treee81edd67a3b77dde68f383afc975aefbcbc1092d
parent5ef5d6bbdb6028b6724c8878119c7e16a24e0ab8
The problem is that diagnostic_action_after_output tries to delete the active
pretty-printer which tries to delete its output_buffer, which is normally
dynamically allocated via placement-new, but the output_buffer used by the
error_buffer of Fortran is statically allocated. Being statically allocated
simplifies a lot pushing/poping several instances of error_buffer.

The solution is to reset the active output_buffer back to the default one
before calling diagnostic_action_after_output. This is a bit ugly, because this
function does use the output_buffer, however, at the point that Fortran calls
it, both are in an equivalent state, thus there is no visible difference.

gcc/testsuite/ChangeLog:

2015-06-24  Manuel López-Ibáñez  <manu@gcc.gnu.org>

PR fortran/66528
* gfortran.dg/maxerrors.f90: New test.

gcc/fortran/ChangeLog:

2015-06-24  Manuel López-Ibáñez  <manu@gcc.gnu.org>

PR fortran/66528
* error.c (gfc_warning_check): Restore the default output_buffer
before calling diagnostic_action_after_output.
(gfc_error_check): Likewise.
(gfc_diagnostics_init): Add comment.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@224926 138bc75d-0d04-0410-961f-82ee72b054a4
gcc/fortran/ChangeLog
gcc/fortran/error.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/maxerrors.f90 [new file with mode: 0644]