diff mbox

[Fortran] Fix DECL of namelist I/O function; fix FINALIZATION

Message ID 53EE8541.309@net-b.de
State New
Headers show

Commit Message

Tobias Burnus Aug. 15, 2014, 10:10 p.m. UTC
This patch fixes two minor issues

a) The argument issue mentioned in 
https://gcc.gnu.org/ml/fortran/2014-08/msg00007.html
The main issue is that the decl uses "void" as argument; the FE passes 
IARG() alias gfc_array_index_type while the library expects a 
GFC_INTEGER_4. As n_dim and ts->kind are small, I have chosen to keep 
GFC_INTEGER_4 in the library and use int32_t for the argument and in the 
decl.

b) resolve_finalizer calls at the end the function, which obtains the 
vtab, which in turns calls the vtab function of the parent, which tries 
to generate the _final entry, which requires that the finalizers are 
resolved. In the test case, the parent's finalizer wasn't ready, leading 
to an ICE in an assert. The patch now first resolves the parent's 
finalizers before taking care of its own.

Build and regtested on x86-64-gnu-linux.
OK for the trunk?

Tobias

Comments

Mikael Morin Aug. 17, 2014, 12:44 p.m. UTC | #1
Le 16/08/2014 00:10, Tobias Burnus a écrit :
> This patch fixes two minor issues
> 
> a) The argument issue mentioned in
> https://gcc.gnu.org/ml/fortran/2014-08/msg00007.html
> The main issue is that the decl uses "void" as argument; the FE passes
> IARG() alias gfc_array_index_type while the library expects a
> GFC_INTEGER_4. As n_dim and ts->kind are small, I have chosen to keep
> GFC_INTEGER_4 in the library and use int32_t for the argument and in the
> decl.
> 
As there is no testcase: did you get a confirmation that the reported
issue is fixed with this?

> b) resolve_finalizer calls at the end the function, which obtains the
> vtab, which in turns calls the vtab function of the parent, which tries
> to generate the _final entry, which requires that the finalizers are
> resolved. In the test case, the parent's finalizer wasn't ready, leading
> to an ICE in an assert. The patch now first resolves the parent's
> finalizers before taking care of its own.
> 
> Build and regtested on x86-64-gnu-linux.
> OK for the trunk?
> 
The patch look good to me.  Both of them. (close to obvious actually)

Thanks.
Mikael
diff mbox

Patch

2014-08-15  Tobias Burnus  <burnus@net-b.de>

	* resolve.c (gfc_resolve_finalizers): Ensure that parents are
	resolved first.

2014-08-15  Tobias Burnus  <burnus@net-b.de>

	* gfortran.dg/finalize_27.f90: New.

diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index ea28ef4..32ff9dd 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -11416,6 +11416,10 @@  gfc_resolve_finalizers (gfc_symbol* derived, bool *finalizable)
   bool seen_scalar = false;
   gfc_symbol *vtab;
   gfc_component *c;
+  gfc_symbol *parent = gfc_get_derived_super_type (derived);
+
+  if (parent)
+    gfc_resolve_finalizers (parent, finalizable);
 
   /* Return early when not finalizable. Additionally, ensure that derived-type
      components have a their finalizables resolved.  */
diff --git a/gcc/testsuite/gfortran.dg/finalize_27.f90 b/gcc/testsuite/gfortran.dg/finalize_27.f90
new file mode 100644
index 0000000..bdc7c45
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/finalize_27.f90
@@ -0,0 +1,25 @@ 
+! { dg-do compile }
+!
+! Was ICEing before
+!
+! Contributed by Reinhold Bader
+!
+
+module mod_fin_04
+  implicit none
+  type :: p_vec
+  contains
+     final :: delete
+  end type p_vec
+  type, extends(p_vec) :: bar
+  contains
+    final :: del2
+  end type bar
+contains
+  subroutine delete(this)
+    type(p_vec) :: this
+  end subroutine delete
+  subroutine del2(this)
+    type(bar) :: this
+  end subroutine del2
+end module