Dear All, This is another corner of a corner case that is not a regression but fixes a wrong-code-on-valid.
At present, an actual argument of an elemental procedure with the VALUE attribute is not passed by value. The fix is obvious. Bootstraps and regtests on FC17/x86_64 - OK for trunk, 4.8 and 4.7? Cheers Paul 2014-02-08 Paul Thomas <pa...@gcc.gnu.org> PR fortran/59026 * trans-expr.c (gfc_conv_procedure_call): Pass the value of the actual argument to a formal argument with the value attribute in an elemental procedure. 2014-02-08 Paul Thomas <pa...@gcc.gnu.org> PR fortran/59026 * gfortran.dg/elemental_by_value_1.f90 : New test
Index: gcc/fortran/trans-expr.c =================================================================== *** gcc/fortran/trans-expr.c (revision 205031) --- gcc/fortran/trans-expr.c (working copy) *************** gfc_conv_procedure_call (gfc_se * se, gf *** 4050,4056 **** --- 4050,4060 ---- gfc_init_se (&parmse, se); parm_kind = ELEMENTAL; + if (fsym && fsym->attr.value) + gfc_conv_expr (&parmse, e); + else gfc_conv_expr_reference (&parmse, e); + if (e->ts.type == BT_CHARACTER && !e->rank && e->expr_type == EXPR_FUNCTION) parmse.expr = build_fold_indirect_ref_loc (input_location, Index: gcc/testsuite/gfortran.dg/elemental_by_value_1.f90 =================================================================== *** gcc/testsuite/gfortran.dg/elemental_by_value_1.f90 (revision 0) --- gcc/testsuite/gfortran.dg/elemental_by_value_1.f90 (working copy) *************** *** 0 **** --- 1,22 ---- + ! { dg-do run } + ! + ! PR fortran/59026 + ! + ! Contributed by F-X Coudert <fxcoud...@gcc.gnu.org> + ! + ! Failed to dereference the argument in scalarized loop. + ! + elemental integer function foo(x) + integer, value :: x + foo = x + 1 + end function + + interface + elemental integer function foo(x) + integer, value :: x + end function + end interface + + if (foo(42) .ne. 43) call abort + if (any (foo([0,1]) .ne. [1,2])) call abort + end