re PR fortran/52469 (-fwhole-file bug: Wrong backend_decl for result of PPC function)

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

From-SVN: r185170
This commit is contained in:
Tobias Burnus 2012-03-10 09:18:31 +01:00 committed by Tobias Burnus
parent 4d8dabdf72
commit e1f6191100
4 changed files with 95 additions and 1 deletions

View 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

View 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;

View 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

View File

@ -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" } }