diff options
author | Manuel López-Ibáñez <manu@gcc.gnu.org> | 2015-06-24 22:16:42 +0000 |
---|---|---|
committer | Manuel López-Ibáñez <manu@gcc.gnu.org> | 2015-06-24 22:16:42 +0000 |
commit | 5862c189c2c3c26864ed9931178f8220ccee701c (patch) | |
tree | e81edd67a3b77dde68f383afc975aefbcbc1092d /gcc | |
parent | b6d10e0b06b82a100a695ae13659c71be34bb032 (diff) | |
download | gcc-5862c189c2c3c26864ed9931178f8220ccee701c.zip gcc-5862c189c2c3c26864ed9931178f8220ccee701c.tar.gz gcc-5862c189c2c3c26864ed9931178f8220ccee701c.tar.bz2 |
The problem is that diagnostic_action_after_output tries to delete the active pretty-printer which tries to delete its output_buffer...
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.
From-SVN: r224926
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fortran/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/fortran/error.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/maxerrors.f90 | 12 |
4 files changed, 29 insertions, 3 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 808bf7e..52f24b2 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,11 @@ +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. + 2015-06-23 Andre Vehreschild <vehre@gmx.de> PR fortran/64674 diff --git a/gcc/fortran/error.c b/gcc/fortran/error.c index 2512cfc..c7d8581 100644 --- a/gcc/fortran/error.c +++ b/gcc/fortran/error.c @@ -1249,7 +1249,6 @@ gfc_clear_warning (void) void gfc_warning_check (void) { - /* This is for the new diagnostics machinery. */ if (! gfc_output_buffer_empty_p (pp_warning_buffer)) { pretty_printer *pp = global_dc->printer; @@ -1259,10 +1258,10 @@ gfc_warning_check (void) warningcount += warningcount_buffered; werrorcount += werrorcount_buffered; gcc_assert (warningcount_buffered + werrorcount_buffered == 1); + pp->buffer = tmp_buffer; diagnostic_action_after_output (global_dc, warningcount_buffered ? DK_WARNING : DK_ERROR); - pp->buffer = tmp_buffer; } } @@ -1381,8 +1380,8 @@ gfc_error_check (void) pp_really_flush (pp); ++errorcount; gcc_assert (gfc_output_buffer_empty_p (pp_error_buffer)); - diagnostic_action_after_output (global_dc, DK_ERROR); pp->buffer = tmp_buffer; + diagnostic_action_after_output (global_dc, DK_ERROR); return true; } @@ -1472,6 +1471,8 @@ gfc_diagnostics_init (void) global_dc->caret_chars[1] = '2'; pp_warning_buffer = new (XNEW (output_buffer)) output_buffer (); pp_warning_buffer->flush_p = false; + /* pp_error_buffer is statically allocated. This simplifies memory + management when using gfc_push/pop_error. */ pp_error_buffer = &(error_buffer.buffer); pp_error_buffer->flush_p = false; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e9f747b..699e70c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-06-24 Manuel López-Ibáñez <manu@gcc.gnu.org> + + PR fortran/66528 + * gfortran.dg/maxerrors.f90: New test. + 2015-06-08 DJ Delorie <dj@redhat.com> * gcc.dg/torture/pr66345.c: Fix assumption about size_t type. diff --git a/gcc/testsuite/gfortran.dg/maxerrors.f90 b/gcc/testsuite/gfortran.dg/maxerrors.f90 new file mode 100644 index 0000000..6c3232d --- /dev/null +++ b/gcc/testsuite/gfortran.dg/maxerrors.f90 @@ -0,0 +1,12 @@ +! { dg-do compile } +! { dg-options "-fmax-errors=1" } +! PR66528 +! { dg-prune-output "compilation terminated" } +program main + read (*,*) n + if (n<0) then + print *,foo + end ! { dg-error "END IF statement expected" } + print *,bar +end program main + |