https://gcc.gnu.org/g:b70bd691cfd77b4d7a453031599bb6f1d48aedf1

commit r15-8945-gb70bd691cfd77b4d7a453031599bb6f1d48aedf1
Author: Harald Anlauf <anl...@gmx.de>
Date:   Wed Mar 26 22:04:39 2025 +0100

    Fortran: fix bogus recursion with DT default initialization [PR118796]
    
            PR fortran/118796
    
    gcc/fortran/ChangeLog:
    
            * resolve.cc: Do not apply default initialization to a derived-type
            function result if the resolved function is use-associated.
    
    gcc/testsuite/ChangeLog:
    
            * gfortran.dg/derived_result_4.f90: New test.

Diff:
---
 gcc/fortran/resolve.cc                         |  3 +-
 gcc/testsuite/gfortran.dg/derived_result_4.f90 | 38 ++++++++++++++++++++++++++
 2 files changed, 40 insertions(+), 1 deletion(-)

diff --git a/gcc/fortran/resolve.cc b/gcc/fortran/resolve.cc
index cf9318ff763c..cb3658917efb 100644
--- a/gcc/fortran/resolve.cc
+++ b/gcc/fortran/resolve.cc
@@ -17946,7 +17946,8 @@ skip_interfaces:
        /* Mark the result symbol to be referenced, when it has allocatable
           components.  */
        sym->result->attr.referenced = 1;
-      else if (a->function && !a->pointer && !a->allocatable && sym->result)
+      else if (a->function && !a->pointer && !a->allocatable && !a->use_assoc
+              && sym->result)
        /* Default initialization for function results.  */
        apply_default_init (sym->result);
     }
diff --git a/gcc/testsuite/gfortran.dg/derived_result_4.f90 
b/gcc/testsuite/gfortran.dg/derived_result_4.f90
new file mode 100644
index 000000000000..12ab1909492a
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/derived_result_4.f90
@@ -0,0 +1,38 @@
+! { dg-do compile }
+! { dg-additional-options "-Wall -Wno-return-type -Wno-unused-variable" }
+!
+! PR fortran/118796 - bogus recursion with DT default initialization
+
+module m1
+  implicit none
+
+  type :: t1
+     type(integer) :: f1 = 0
+  end type t1
+
+  TYPE :: c1
+   contains
+     procedure, public :: z
+  END TYPE c1
+
+contains
+  ! type-bound procedure z has a default initialization
+  function z( this )
+    type(t1) :: z
+    class(c1), intent(in) :: this
+  end function z
+end module m1
+
+module m2
+  use m1, only : c1
+contains
+  function z() result(field)
+  end function z
+end module m2
+
+module m3
+  use m1, only : c1
+contains
+  function z()
+  end function z
+end module m3

Reply via email to