]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR fortran/52469 (-fwhole-file bug: Wrong backend_decl for result of PPC function)
authorTobias Burnus <burnus@net-b.de>
Sat, 10 Mar 2012 09:20:22 +0000 (10:20 +0100)
committerTobias Burnus <burnus@gcc.gnu.org>
Sat, 10 Mar 2012 09:20:22 +0000 (10:20 +0100)
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-03-10  Tobias Burnus  <burnus@net-b.de>

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

From-SVN: r185173

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 6ba084fd8d5ad3701e6fbfc6716ccc83d2886779..f78663e6dd1b8130c4f02474a0590de6e1098c4f 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-03-06  Tobias Burnus  <burnus@net-b.de>
 
        Backport from mainline
index ca078963234ef06da41af6f2101714e68b456856..fca2bb1445cd723649ece6755a929f30ed0b5136 100644 (file)
@@ -2519,7 +2519,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_TREE;
index a2a21565a6f5e67ef83bf2a5c5ce70dc46650b0e..70e599977f34eaeed16847a84779e6cd259ffde3 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-06  Tobias Burnus  <burnus@net-b.de>
 
        Backport from mainline
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" } }