OSDN Git Service

2012-03-10 Tobias Burnus <burnus@net-b.de>
authorburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 10 Mar 2012 08:18:31 +0000 (08:18 +0000)
committerburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 10 Mar 2012 08:18:31 +0000 (08:18 +0000)
        PR fortran/52469
        * trans-types.c (gfc_get_function_type): Handle backend_decl
        of a procedure pointer.

2012-03-10  Tobias Burnus  <burnus@net-b.de>

        PR fortran/52469
        * gfortran.dg/proc_ptr_34.f90

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@185170 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/fortran/ChangeLog
gcc/fortran/trans-types.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/proc_ptr_34.f90 [new file with mode: 0644]

index 4867087..b295c66 100644 (file)
@@ -1,3 +1,9 @@
+2012-03-10  Tobias Burnus  <burnus@net-b.de>
+
+       PR fortran/52469
+       * trans-types.c (gfc_get_function_type): Handle backend_decl
+       of a procedure pointer.
+
 2012-02-29  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/52386
index 2579e23..dfd73da 100644 (file)
@@ -2673,7 +2673,11 @@ gfc_get_function_type (gfc_symbol * sym)
              || sym->attr.flavor == FL_PROGRAM);
 
   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);
+    }
 
   alternate_return = 0;
   typelist = NULL;
index 0f56e01..04a2f9e 100644 (file)
@@ -1,3 +1,8 @@
+2012-03-10  Tobias Burnus  <burnus@net-b.de>
+
+       PR fortran/52469
+       * gfortran.dg/proc_ptr_34.f90: New.
+
 2012-03-07  Jason Merrill  <jason@redhat.com>
 
        PR c++/52521
diff --git a/gcc/testsuite/gfortran.dg/proc_ptr_34.f90 b/gcc/testsuite/gfortran.dg/proc_ptr_34.f90
new file mode 100644 (file)
index 0000000..6226414
--- /dev/null
@@ -0,0 +1,79 @@
+! { dg-do compile }
+!
+! PR fortran/52469
+!
+! This was failing as the DECL of the proc pointer "func"
+! was used for the interface of the proc-pointer component "my_f_ptr"
+! rather than the decl of the proc-pointer target
+!
+! Contributed by palott@gmail.com
+!
+
+module ExampleFuncs
+  implicit none
+
+  ! NOTE: "func" is a procedure pointer!
+  pointer :: func
+  interface
+     function func (z)
+        real :: func
+        real, intent (in) :: z
+     end function func
+  end interface
+
+  type Contains_f_ptr
+     procedure (func), pointer, nopass :: my_f_ptr
+  end type Contains_f_ptr
+contains
+
+function f1 (x)
+  real :: f1
+  real, intent (in) :: x
+
+  f1 = 2.0 * x
+
+  return
+end function f1
+
+function f2 (x)
+   real :: f2
+   real, intent (in) :: x
+
+   f2 = 3.0 * x**2
+
+   return
+end function f2
+
+function fancy (func, x)
+   real :: fancy
+   real, intent (in) :: x
+
+   interface AFunc
+      function func (y)
+         real :: func
+         real, intent (in) ::y
+      end function func
+   end interface AFunc
+
+   fancy = func (x) + 3.3 * x
+end function fancy
+
+end module  ExampleFuncs
+
+
+program test_proc_ptr
+  use ExampleFuncs
+  implicit none
+
+  type (Contains_f_ptr), dimension (2) :: NewType
+  !NewType(1) % my_f_ptr => f1
+  NewType(2) % my_f_ptr => f2
+
+  !write (*, *) NewType(1) % my_f_ptr (3.0), NewType(2) % my_f_ptr (3.0)
+  write (6, *)  NewType(2) % my_f_ptr (3.0) ! < Shall print '27.0'
+
+  stop
+end program test_proc_ptr
+
+! { dg-final { cleanup-modules "examplefuncs" } }