Do not generate recursion check for compiler-generated procedures.
authorThomas Koenig <tkoenig@gcc.gnu.org>
Mon, 29 Jun 2020 21:11:06 +0000 (23:11 +0200)
committerThomas Koenig <tkoenig@gcc.gnu.org>
Mon, 29 Jun 2020 21:11:30 +0000 (23:11 +0200)
This one-line fix removes a check for recursion for procedures
which are compiler-generated, such as finalizers or deallocation.
These need to be recursive, even if the user code should not be.

gcc/fortran/ChangeLog:

PR fortran/95743
* trans-decl.c (gfc_generate_function_code): Do not generate
recursion check for compiler-generated procedures.

gcc/fortran/trans-decl.c
gcc/testsuite/gfortran.dg/recursive_check_16.f90 [new file with mode: 0644]

index e10122e..769ab20 100644 (file)
@@ -6789,7 +6789,7 @@ gfc_generate_function_code (gfc_namespace * ns)
                 || (sym->attr.entry_master
                     && sym->ns->entries->sym->attr.recursive);
   if ((gfc_option.rtcheck & GFC_RTCHECK_RECURSION)
-      && !is_recursive && !flag_recursive)
+      && !is_recursive && !flag_recursive && !sym->attr.artificial)
     {
       char * msg;
 
diff --git a/gcc/testsuite/gfortran.dg/recursive_check_16.f90 b/gcc/testsuite/gfortran.dg/recursive_check_16.f90
new file mode 100644 (file)
index 0000000..d8e9d69
--- /dev/null
@@ -0,0 +1,25 @@
+! { dg-do  run }
+! ! { dg-options "-fcheck=recursion" }
+! PR 95743 - this used cause a runtime error.
+! Test case by Antoine Lemoine
+
+program test_recursive_call
+   implicit none
+
+   type t_tree_node
+      type(t_tree_node), dimension(:), allocatable :: child
+   end type
+
+   type t_tree
+      type(t_tree_node), allocatable :: root
+   end type
+
+   type(t_tree), allocatable :: tree
+
+   allocate(tree)
+   allocate(tree%root)
+   allocate(tree%root%child(1))
+   ! If the line below is removed, the code works fine.
+   allocate(tree%root%child(1)%child(1))
+   deallocate(tree)
+end program