https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119948

kargls at comcast dot net changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |kargls at comcast dot net

--- Comment #1 from kargls at comcast dot net ---
(In reply to Damian Rouson from comment #0)

> % gfortran --version                                  
> GNU Fortran (GCC) 15.0.1 20250412 (experimental)
> 
> 
> If the separate "result" clause is eliminated and the procedure name is
> therefore the result name ("test"), then the error message changes to 
> 
> 
>    17 |     allocate(test%i, source = 0)
>       |                  1
> Error: ‘test’ at (1) is not a variable

With this patch,

diff --git a/gcc/fortran/primary.cc b/gcc/fortran/primary.cc
index 161d4c26964..44572f136cd 100644
--- a/gcc/fortran/primary.cc
+++ b/gcc/fortran/primary.cc
@@ -4412,6 +4412,11 @@ match_variable (gfc_expr **result, int equiv_flag, int
host_flag)
          || replace_hidden_procptr_result (&sym, &st))
        break;

+      if (sym->attr.function
+         && sym == sym->result
+         && gfc_is_function_return_value (sym, gfc_current_ns))
+       break;
+
       /* Fall through to error */
       gcc_fallthrough ();



The following code compiles and executes

module test_m
  implicit none

  type test_t
    integer, allocatable :: i
  end type

  interface
    pure module function test()
      implicit none
      type(test_t) test
    end function
  end interface

contains
  module procedure test
    allocate(test%i, source = 42)
  end procedure

end module

program foo
   use test_m
   type(test_t) a
   a = test()
   print *, a%i
end program foo

% gfcx -o z a.f90 && ./z
          42


I, however, do not understand lines 4392-4409 in primary.cc.

Reply via email to