From: tobi Date: Fri, 4 Mar 2005 21:03:46 +0000 (+0000) Subject: fortran/ X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=7eeec80a8752b6e562a00d9821a1552fe5e76164;p=thirdparty%2Fgcc.git fortran/ PR fortran/19673 * trans-expr.c (gfc_conv_function_call): Correctly dereference argument from a pointer function also if it has a result clause. testsuite/ PR fortran/19673 * gfortran.dg/func_result_1.f90: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@95901 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index b612122dd4fe..db94aa67b27d 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,4 +1,10 @@ -Steven G. Kargl +2005-03-04 Tobias Schl"uter + + PR fortran/19673 + * trans-expr.c (gfc_conv_function_call): Correctly dereference + argument from a pointer function also if it has a result clause. + +2005-03-04 Steven G. Kargl * expr.c (gfc_copy_shape_excluding): Change && to ||. diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index 685a9f97f9e7..b79d0743decd 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -1220,7 +1220,8 @@ gfc_conv_function_call (gfc_se * se, gfc_symbol * sym, something like x = f() where f is pointer valued, we have to dereference the result. */ - if (sym->attr.pointer && !se->want_pointer && !byref) + if (!se->want_pointer && !byref + && (sym->attr.pointer || (sym->result && sym->result->attr.pointer))) se->expr = gfc_build_indirect_ref (se->expr); /* A pure function may still have side-effects - it may modify its diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index adc463c7b13d..bf945a09a5a0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-03-04 Tobias Schl"uter + + PR fortran/19673 + * gfortran.dg/func_result_1.f90: New test. + 2005-03-04 Ben Elliston * gcc.misc-tests/options.exp: New test. diff --git a/gcc/testsuite/gfortran.dg/func_result_1.f90 b/gcc/testsuite/gfortran.dg/func_result_1.f90 new file mode 100644 index 000000000000..ce3c2e4e6856 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/func_result_1.f90 @@ -0,0 +1,19 @@ +! { dg-do run } +! From PR 19673 : We didn't dereference the the result from POINTER +! functions with a RESULT clause +program ret_ptr + if (foo(99) /= bar(99)) call abort () +contains + function foo (arg) result(ptr) + integer :: arg + integer, pointer :: ptr + allocate (ptr) + ptr = arg + end function foo + function bar (arg) + integer :: arg + integer, pointer :: bar + allocate (bar) + bar = arg + end function bar +end program ret_ptr