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

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|rejects-valid, wrong-code   |ice-on-valid-code
             Status|NEW                         |ASSIGNED

--- Comment #5 from Tobias Burnus <burnus at gcc dot gnu.org> 2012-03-08 
11:32:50 UTC ---
The problem already occurs for gfc_get_derived_type's call to gfc_get_ppc_type,
which calls in turn gfc_get_function_type.

For -fno-whole-file), gfc_get_function_type returns the function decl, for
-fwhole-file it returns a pointer to the function decl.

The reason is that for -fwhole-file, "sym" (sym->name == "func") already has a
backend_decl - one which has a pointer.

 * * *

Actually, the example source code is rather tricky:

  pointer :: func
  interface
     function func (z)
        real :: func
        real, intent (in) :: z
     end function func
  end interface

This declares a procedure pointer "func", i.e. it's the same as:

  abstract interface
     function template (z)
        real :: template
        real, intent (in) :: z
     end function template
  end interface
  procedure(template), pointer :: func


But at the same time, the original "func" is used as:

  type Contains_f_ptr
     procedure (func), pointer, nopass :: my_f_ptr
  end type Contains_f_ptr

Where "func" denotes the interface to which the procedure pointer points to
(i.e. "template" in the modified exampled). In trans-type.c, the proc pointer
is completely unexpected and thus it fails.

It should be possible to modify the example such that it also fails with
-fno-whole-file.


Draft patch:

--- a/gcc/fortran/trans-types.c
+++ b/gcc/fortran/trans-types.c
@@ -2680,3 +2694,7 @@ gfc_get_function_type (gfc_symbol * sym)
   if (sym->backend_decl)
-    return TREE_TYPE (sym->backend_decl);
+    {
+      if (sym->attr.proc_pointer)
+       return TREE_TYPE (TREE_TYPE (sym->backend_decl));
+      return TREE_TYPE (sym->backend_decl);
+    }

Reply via email to