diff options
author | Janus Weil <janus@gcc.gnu.org> | 2009-06-19 10:11:21 +0200 |
---|---|---|
committer | Janus Weil <janus@gcc.gnu.org> | 2009-06-19 10:11:21 +0200 |
commit | 7e9c61e83e48581f9808b3796f474094aa58e3ce (patch) | |
tree | 26ce7c12125bf366fb5485bdb30e225cbcfca713 /gcc | |
parent | dd26af706356004ab4a02b4f42a9f1a3b1e8bfbf (diff) | |
download | gcc-7e9c61e83e48581f9808b3796f474094aa58e3ce.zip gcc-7e9c61e83e48581f9808b3796f474094aa58e3ce.tar.gz gcc-7e9c61e83e48581f9808b3796f474094aa58e3ce.tar.bz2 |
re PR fortran/40450 ([F03] procedure pointer as actual argument)
2009-06-19 Janus Weil <janus@gcc.gnu.org>
PR fortran/40450
* trans-expr.c (gfc_conv_procedure_call): Only add an extra addr_expr
to a procedure pointer actual argument, if it is not itself a
dummy arg.
2009-06-19 Janus Weil <janus@gcc.gnu.org>
PR fortran/40450
* gfortran.dg/proc_ptr_20.f90: New.
From-SVN: r148690
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fortran/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/fortran/trans-expr.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/proc_ptr_20.f90 | 42 |
4 files changed, 57 insertions, 1 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index d6a6082..d3d140b 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2009-06-19 Janus Weil <janus@gcc.gnu.org> + + PR fortran/40450 + * trans-expr.c (gfc_conv_procedure_call): Only add an extra addr_expr + to a procedure pointer actual argument, if it is not itself a + dummy arg. + 2009-06-18 Janus Weil <janus@gcc.gnu.org> PR fortran/40451 diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index a4d00df..765c04f 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -2646,7 +2646,9 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym, if (fsym && e->expr_type != EXPR_NULL && ((fsym->attr.pointer && fsym->attr.flavor != FL_PROCEDURE) - || fsym->attr.proc_pointer)) + || (fsym->attr.proc_pointer + && !(e->expr_type == EXPR_VARIABLE + && e->symtree->n.sym->attr.dummy)))) { /* Scalar pointer dummy args require an extra level of indirection. The null pointer already contains diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 540f408..7ddc758 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-06-19 Janus Weil <janus@gcc.gnu.org> + + PR fortran/40450 + * gfortran.dg/proc_ptr_20.f90: New. + 2009-06-18 H.J. Lu <hongjiu.lu@intel.com> PR target/40470 diff --git a/gcc/testsuite/gfortran.dg/proc_ptr_20.f90 b/gcc/testsuite/gfortran.dg/proc_ptr_20.f90 new file mode 100644 index 0000000..79c9ba8 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/proc_ptr_20.f90 @@ -0,0 +1,42 @@ +! { dg-do run } +! +! PR 40450: [F03] procedure pointer as actual argument +! +! Contributed by John McFarland <john.mcfarland@swri.org> + +MODULE m + ABSTRACT INTERFACE + SUBROUTINE sub() + END SUBROUTINE sub + END INTERFACE + +CONTAINS + + SUBROUTINE passf(f2) + PROCEDURE(sub), POINTER:: f2 + CALL callf(f2) + END SUBROUTINE passf + + SUBROUTINE callf(f3) + PROCEDURE(sub), POINTER :: f3 + PRINT*, 'calling f' + CALL f3() + END SUBROUTINE callf +END MODULE m + + +PROGRAM prog + USE m + PROCEDURE(sub), POINTER :: f1 + f1 => s + CALL passf(f1) + +CONTAINS + + SUBROUTINE s + PRINT*, 'sub' + END SUBROUTINE s +END PROGRAM prog + +! { dg-final { cleanup-modules "m" } } + |