re PR fortran/52469 (-fwhole-file bug: Wrong backend_decl for result of PPC function)
authorTobias Burnus <burnus@net-b.de>
Thu, 8 Mar 2012 19:36:43 +0000 (20:36 +0100)
committerTobias Burnus <burnus@gcc.gnu.org>
Thu, 8 Mar 2012 19:36:43 +0000 (20:36 +0100)
2012-03-08  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-08  Tobias Burnus  <burnus@net-b.de>

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

From-SVN: r185109

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 3d10d9fbc9b268d23ea7bc9ed823993dfeaad016..d3ef58d21ae715c1cd3a65b56201d70fd3ff0641 100644 (file)
@@ -1,3 +1,9 @@
+2012-03-08  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  Steven Bosscher  <steven@gcc.gnu.org>
 
        * f95-lang.c (yyerror, yylex): Remove.
index 6ff1d33957bc877a7c8557150657301fe2bef6af..0f2912de1afbe78de9b7f8216174208239df71d1 100644 (file)
@@ -2678,7 +2678,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 83b7c664adc04c118f2e702b009e2d58b4785304..42ce3106dcf4a13abf5ac1b730d63b5415da6aa0 100644 (file)
@@ -1,3 +1,8 @@
+2012-03-08  Tobias Burnus  <burnus@net-b.de>
+
+       PR fortran/52469
+       * gfortran.dg/proc_ptr_34.f90
+
 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" } }