See attached patch.

I plan to commit this one as simple.

Also obvious. (Even less than one line)

Regression tested on x86_64.

Best regards,

Jerry

---
    fortran: [PR78718] ICE in gfc_get_symbol_decl, at fortran/trans-decl.c

            PR fortran/78718

    gcc/fortran/ChangeLog:

            * resolve.cc (was_declared): Recognize the RESULT attribute so a
            function's result variable is not mistaken for a host-associated
            symbol of the same name.

    gcc/testsuite/ChangeLog:

            * gfortran.dg/func_result_8.f90: New test.

---
commit 7f382d79cf61964da40c467ee58c7155cbbbc069
Author: Jerry DeLisle <[email protected]>
Date:   Fri Jul 10 21:47:59 2026 -0700

    fortran: [PR78718] ICE in gfc_get_symbol_decl, at fortran/trans-decl.c
    
            PR fortran/78718
    
    gcc/fortran/ChangeLog:
    
            * resolve.cc (was_declared): Recognize the RESULT attribute so a
            function's result variable is not mistaken for a host-associated
            symbol of the same name.
    
    gcc/testsuite/ChangeLog:
    
            * gfortran.dg/func_result_8.f90: New test.

diff --git a/gcc/fortran/resolve.cc b/gcc/fortran/resolve.cc
index 5f3edb37aa4..036da9a939e 100644
--- a/gcc/fortran/resolve.cc
+++ b/gcc/fortran/resolve.cc
@@ -1655,7 +1655,7 @@ was_declared (gfc_symbol *sym)
   if (a.allocatable || a.dimension || a.dummy || a.external || a.intrinsic
       || a.optional || a.pointer || a.save || a.target || a.volatile_
       || a.value || a.access != ACCESS_UNKNOWN || a.intent != INTENT_UNKNOWN
-      || a.asynchronous || a.codimension || a.subroutine)
+      || a.asynchronous || a.codimension || a.subroutine || a.result)
     return 1;
 
   return 0;
diff --git a/gcc/testsuite/gfortran.dg/func_result_8.f90 b/gcc/testsuite/gfortran.dg/func_result_8.f90
new file mode 100644
index 00000000000..bbe0b25395c
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/func_result_8.f90
@@ -0,0 +1,17 @@
+! { dg-do run }
+!
+! PR fortran/78718
+program p
+   integer :: n, m
+   n = 1
+   if (f() /= 1) stop 1
+contains
+   function f() result(m)
+      call s(n, m)
+   end function
+end program
+
+subroutine s(a, b)
+   integer :: a, b
+   b = a
+end subroutine

Reply via email to