aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Thomas <pault@gcc.gnu.org>2014-02-09 19:45:06 +0000
committerPaul Thomas <pault@gcc.gnu.org>2014-02-09 19:45:06 +0000
commit56c78e5c22f59741aba3aac3fa89452895be36bf (patch)
treebb0721638c4b44251517f88b2484f1ddd20eda41
parent5a47e4c519a94e176d66ca803b1ca82e9e8cefc4 (diff)
downloadgcc-56c78e5c22f59741aba3aac3fa89452895be36bf.zip
gcc-56c78e5c22f59741aba3aac3fa89452895be36bf.tar.gz
gcc-56c78e5c22f59741aba3aac3fa89452895be36bf.tar.bz2
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
-rw-r--r--gcc/fortran/ChangeLog7
-rw-r--r--gcc/fortran/trans-expr.c6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/elemental_by_value_1.f9022
4 files changed, 39 insertions, 1 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 052248c..ab2171a 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,10 @@
+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>
Mikael Morin <mikael.morin@gcc.gnu.org>
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c
index 12da0a0..297ff67 100644
--- a/gcc/fortran/trans-expr.c
+++ b/gcc/fortran/trans-expr.c
@@ -4047,7 +4047,11 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
gfc_init_se (&parmse, se);
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
&& e->expr_type == EXPR_FUNCTION)
parmse.expr = build_fold_indirect_ref_loc (input_location,
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9b9d2cd..d70b762 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+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>
PR fortran/58470
diff --git a/gcc/testsuite/gfortran.dg/elemental_by_value_1.f90 b/gcc/testsuite/gfortran.dg/elemental_by_value_1.f90
new file mode 100644
index 0000000..4fc5947
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/elemental_by_value_1.f90
@@ -0,0 +1,22 @@
+! { 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