Commit 56c78e5c by Paul Thomas

re PR fortran/59026 (ELEMENTAL procedure with VALUE arguments emits wrong code)

2014-02-09  Paul Thomas  <pault@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-09  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/59026
	* gfortran.dg/elemental_by_value_1.f90 : New test

From-SVN: r207645
parent 5a47e4c5
2014-02-09 Paul Thomas <pault@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 Janus Weil <janus@gcc.gnu.org> 2014-02-08 Janus Weil <janus@gcc.gnu.org>
Mikael Morin <mikael.morin@gcc.gnu.org> Mikael Morin <mikael.morin@gcc.gnu.org>
......
...@@ -4047,7 +4047,11 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym, ...@@ -4047,7 +4047,11 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
gfc_init_se (&parmse, se); gfc_init_se (&parmse, se);
parm_kind = ELEMENTAL; parm_kind = ELEMENTAL;
gfc_conv_expr_reference (&parmse, e); 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 if (e->ts.type == BT_CHARACTER && !e->rank
&& e->expr_type == EXPR_FUNCTION) && e->expr_type == EXPR_FUNCTION)
parmse.expr = build_fold_indirect_ref_loc (input_location, parmse.expr = build_fold_indirect_ref_loc (input_location,
......
2014-02-09 Paul Thomas <pault@gcc.gnu.org>
PR fortran/59026
* gfortran.dg/elemental_by_value_1.f90 : New test
2014-02-08 Janus Weil <janus@gcc.gnu.org> 2014-02-08 Janus Weil <janus@gcc.gnu.org>
PR fortran/58470 PR fortran/58470
......
! { dg-do run }
!
! PR fortran/59026
!
! Contributed by F-X Coudert <fxcoudert@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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment