aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Koenig <tkoenig@gcc.gnu.org>2019-03-10 10:42:23 +0000
committerThomas Koenig <tkoenig@gcc.gnu.org>2019-03-10 10:42:23 +0000
commit4932364bd569d131e6f0dbb68ed5a538be3d07f3 (patch)
tree9ba42260481ecfc8c22628b12bdd09b6d36b193f
parent2263c69edc270c1e762c88e771d12dd5d09b052d (diff)
downloadgcc-4932364bd569d131e6f0dbb68ed5a538be3d07f3.zip
gcc-4932364bd569d131e6f0dbb68ed5a538be3d07f3.tar.gz
gcc-4932364bd569d131e6f0dbb68ed5a538be3d07f3.tar.bz2
re PR fortran/66089 (elemental dependency mishandling when class array are involved)
2019-03-10 Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/66089 * trans-array.c (gfc_scalar_elemental_arg_saved_as_reference): Return false if a scalar tempoary is needed. (gfc_walk_variable_expr): Fix up class refs. 2019-03-10 Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/66089 * gfortran.dg/dependency_53.f90: New test. From-SVN: r269549
-rw-r--r--gcc/fortran/ChangeLog7
-rw-r--r--gcc/fortran/trans-array.c5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/dependency_53.f9025
4 files changed, 42 insertions, 0 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index d8f5abb..8ad4361 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,5 +1,12 @@
2019-03-10 Thomas Koenig <tkoenig@gcc.gnu.org>
+ PR fortran/66089
+ * trans-array.c (gfc_scalar_elemental_arg_saved_as_reference):
+ Return false if a scalar tempoary is needed.
+ (gfc_walk_variable_expr): Fix up class refs.
+
+2019-03-10 Thomas Koenig <tkoenig@gcc.gnu.org>
+
PR fortran/87734
* symbol.c (gfc_add_procedure): Only throw an error if the
procedure has not been declared either PUBLIC or PRIVATE.
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c
index 6192e68..1379426 100644
--- a/gcc/fortran/trans-array.c
+++ b/gcc/fortran/trans-array.c
@@ -2699,6 +2699,9 @@ gfc_scalar_elemental_arg_saved_as_reference (gfc_ss_info * ss_info)
if (ss_info->type != GFC_SS_REFERENCE)
return false;
+ if (ss_info->data.scalar.needs_temporary)
+ return false;
+
/* If the actual argument can be absent (in other words, it can
be a NULL reference), don't try to evaluate it; pass instead
the reference directly. */
@@ -10515,6 +10518,8 @@ gfc_walk_variable_expr (gfc_ss * ss, gfc_expr * expr)
{
gfc_ref *ref;
+ gfc_fix_class_refs (expr);
+
for (ref = expr->ref; ref; ref = ref->next)
if (ref->type == REF_ARRAY && ref->u.ar.type != AR_ELEMENT)
break;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 05be099..cb07129 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2019-03-10 Thomas Koenig <tkoenig@gcc.gnu.org>
+ PR fortran/66089
+ * gfortran.dg/dependency_53.f90: New test.
+
+2019-03-10 Thomas Koenig <tkoenig@gcc.gnu.org>
+
PR fortran/87734
* gfortran.dg/public_private_module_10.f90: New test.
diff --git a/gcc/testsuite/gfortran.dg/dependency_53.f90 b/gcc/testsuite/gfortran.dg/dependency_53.f90
new file mode 100644
index 0000000..a45302f
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/dependency_53.f90
@@ -0,0 +1,25 @@
+! { dg-do run }
+! PR fortran/66089 - used to ICE and, after that ICE was fixed,
+! gave wrong results.
+ type :: t
+ integer :: c
+ end type t
+
+ class(t), dimension(:), allocatable :: b,c
+
+ allocate (b(5), source=t(7))
+ allocate(c(5), source=t(13))
+ c = plus(c(1), b)
+ if (any(c%c /= 20)) stop 1
+ c = t(13)
+ c = plus(b, c(1))
+ if (any(c%c /= 20)) stop 2
+contains
+
+ elemental function plus(lhs, rhs)
+ class(t), intent(in) :: lhs, rhs
+ type(t) :: plus
+ plus%c = lhs%c + rhs%c
+ end function plus
+
+end