From: Tobias Burnus Date: Sat, 10 Mar 2012 09:20:22 +0000 (+0100) Subject: re PR fortran/52469 (-fwhole-file bug: Wrong backend_decl for result of PPC function) X-Git-Tag: releases/gcc-4.6.4~648 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9410d8bf7016671eb702eb3ce16401d46c8603be;p=thirdparty%2Fgcc.git re PR fortran/52469 (-fwhole-file bug: Wrong backend_decl for result of PPC function) 2012-03-10 Tobias Burnus PR fortran/52469 * trans-types.c (gfc_get_function_type): Handle backend_decl of a procedure pointer. 2012-03-10 Tobias Burnus PR fortran/52469 * gfortran.dg/proc_ptr_34.f90: New. From-SVN: r185173 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 6ba084fd8d5a..f78663e6dd1b 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2012-03-10 Tobias Burnus + + PR fortran/52469 + * trans-types.c (gfc_get_function_type): Handle backend_decl + of a procedure pointer. + 2012-03-06 Tobias Burnus Backport from mainline diff --git a/gcc/fortran/trans-types.c b/gcc/fortran/trans-types.c index ca078963234e..fca2bb1445cd 100644 --- a/gcc/fortran/trans-types.c +++ b/gcc/fortran/trans-types.c @@ -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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a2a21565a6f5..70e599977f34 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-03-10 Tobias Burnus + + PR fortran/52469 + * gfortran.dg/proc_ptr_34.f90: New. + 2012-03-06 Tobias Burnus 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 index 000000000000..6226414b8196 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/proc_ptr_34.f90 @@ -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" } }