aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/class.c
diff options
context:
space:
mode:
authorPaul Thomas <pault@gcc.gnu.org>2015-11-08 16:47:58 +0000
committerPaul Thomas <pault@gcc.gnu.org>2015-11-08 16:47:58 +0000
commit57905c2bb3dc00409591f58a8e335cd16c2940ff (patch)
tree7720d688995fe86e6ff242df8dbbe7f19bf73554 /gcc/fortran/class.c
parent210172f47dac16f21001d617e9175c563f2fdfd1 (diff)
downloadgcc-57905c2bb3dc00409591f58a8e335cd16c2940ff.zip
gcc-57905c2bb3dc00409591f58a8e335cd16c2940ff.tar.gz
gcc-57905c2bb3dc00409591f58a8e335cd16c2940ff.tar.bz2
re PR fortran/68196 (ICE on function result with procedure pointer component)
2015-11-08 Paul Thomas <pault@gcc.gnu.org> PR fortran/68196 * class.c (has_finalizer_component): Prevent infinite recursion through this function if the derived type and that of its component are the same. * trans-types.c (gfc_get_derived_type): Do the same for proc pointers by ignoring the explicit interface for the component. PR fortran/66465 * check.c (same_type_check): If either of the expressions is BT_PROCEDURE, use the typespec from the symbol, rather than the expression. 2015-11-08 Paul Thomas <pault@gcc.gnu.org> PR fortran/68196 * gfortran.dg/proc_ptr_47.f90: New test. PR fortran/66465 * gfortran.dg/pr66465.f90: New test. From-SVN: r229954
Diffstat (limited to 'gcc/fortran/class.c')
-rw-r--r--gcc/fortran/class.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/gcc/fortran/class.c b/gcc/fortran/class.c
index 7a9e275..8b49ae9 100644
--- a/gcc/fortran/class.c
+++ b/gcc/fortran/class.c
@@ -843,7 +843,11 @@ has_finalizer_component (gfc_symbol *derived)
&& c->ts.u.derived->f2k_derived->finalizers)
return true;
+ /* Stop infinite recursion through this function by inhibiting
+ calls when the derived type and that of the component are
+ the same. */
if (c->ts.type == BT_DERIVED
+ && !gfc_compare_derived_types (derived, c->ts.u.derived)
&& !c->attr.pointer && !c->attr.allocatable
&& has_finalizer_component (c->ts.u.derived))
return true;