http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49397

Tobias Burnus <burnus at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |diagnostic,
                   |                            |ice-on-invalid-code

--- Comment #8 from Tobias Burnus <burnus at gcc dot gnu.org> ---
 (In reply to Tobias Burnus from comment #0)
> Cf. Intepretation Request J3/11-198 at
> http://j3-fortran.org/doc/meeting/195/11-198.txt

That became Interpretation Request F08/0060 - see
http://j3-fortran.org/doc/year/13/13-006A.txt; passed all ballots and is part
of Fortran 2008 Corr. 2.


(In reply to janus from comment #5)
> Here is a reduced test case for the ICE:
>   Print *,f()
> Contains
>   Subroutine s
>     Procedure(Real),Pointer :: p
>     p => f 
>   End Subroutine
> End

The problem seems to be that "f" is not marked as external. That's fixed by the
patch below. [ICE on VALID CODE]


However, the following code still ICEs:

Contains
  Subroutine s
    Procedure(Real),Pointer :: p
    p => g
  End Subroutine
End

That's invalid (C729: "... or an external procedure that is accessed by use or
host association, referenced in the scoping unit as a procedure, or that has
the EXTERNAL attribute".)

Thus, we need to issue an error in this case. (ICE on INVALID) - it currently
ICEs even with the patch below.


--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -2872,4 +2872,8 @@ resolve_function (gfc_expr *expr)
   if (sym && is_external_proc (sym))
-    resolve_global_procedure (sym, &expr->where,
-                  &expr->value.function.actual, 0);
+    {
+      resolve_global_procedure (sym, &expr->where,
+                &expr->value.function.actual, 0);
+      if (sym->attr.if_source == IFSRC_UNKNOWN)
+    sym->attr.external = 1;
+    }

Reply via email to