diff options
author | Tobias Burnus <burnus@net-b.de> | 2012-03-08 20:36:43 +0100 |
---|---|---|
committer | Tobias Burnus <burnus@gcc.gnu.org> | 2012-03-08 20:36:43 +0100 |
commit | 232d1950fd1cc440b0d7673246614c360744984e (patch) | |
tree | 9443afab81e4ef90ee741cf6182f4589a68beb06 | |
parent | a3299120f38a99b7e488ef54c1ef6fb5572d7f1d (diff) | |
download | gcc-232d1950fd1cc440b0d7673246614c360744984e.zip gcc-232d1950fd1cc440b0d7673246614c360744984e.tar.gz gcc-232d1950fd1cc440b0d7673246614c360744984e.tar.bz2 |
re PR fortran/52469 (-fwhole-file bug: Wrong backend_decl for result of PPC function)
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
-rw-r--r-- | gcc/fortran/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fortran/trans-types.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/proc_ptr_34.f90 | 79 |
4 files changed, 95 insertions, 1 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 3d10d9f..d3ef58d 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -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. diff --git a/gcc/fortran/trans-types.c b/gcc/fortran/trans-types.c index 6ff1d33..0f2912d 100644 --- a/gcc/fortran/trans-types.c +++ b/gcc/fortran/trans-types.c @@ -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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 83b7c66..42ce310 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 index 0000000..6226414b --- /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" } } |