aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorManuel López-Ibáñez <manu@gcc.gnu.org>2015-06-24 22:16:42 +0000
committerManuel López-Ibáñez <manu@gcc.gnu.org>2015-06-24 22:16:42 +0000
commit5862c189c2c3c26864ed9931178f8220ccee701c (patch)
treee81edd67a3b77dde68f383afc975aefbcbc1092d /gcc
parentb6d10e0b06b82a100a695ae13659c71be34bb032 (diff)
downloadgcc-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/ChangeLog8
-rw-r--r--gcc/fortran/error.c7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/maxerrors.f9012
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
+