Commit 4932364b by Thomas Koenig

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
parent 2263c69e
2019-03-10 Thomas Koenig <tkoenig@gcc.gnu.org> 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 PR fortran/87734
* symbol.c (gfc_add_procedure): Only throw an error if the * symbol.c (gfc_add_procedure): Only throw an error if the
procedure has not been declared either PUBLIC or PRIVATE. procedure has not been declared either PUBLIC or PRIVATE.
......
...@@ -2699,6 +2699,9 @@ gfc_scalar_elemental_arg_saved_as_reference (gfc_ss_info * ss_info) ...@@ -2699,6 +2699,9 @@ gfc_scalar_elemental_arg_saved_as_reference (gfc_ss_info * ss_info)
if (ss_info->type != GFC_SS_REFERENCE) if (ss_info->type != GFC_SS_REFERENCE)
return false; return false;
if (ss_info->data.scalar.needs_temporary)
return false;
/* If the actual argument can be absent (in other words, it can /* If the actual argument can be absent (in other words, it can
be a NULL reference), don't try to evaluate it; pass instead be a NULL reference), don't try to evaluate it; pass instead
the reference directly. */ the reference directly. */
...@@ -10515,6 +10518,8 @@ gfc_walk_variable_expr (gfc_ss * ss, gfc_expr * expr) ...@@ -10515,6 +10518,8 @@ gfc_walk_variable_expr (gfc_ss * ss, gfc_expr * expr)
{ {
gfc_ref *ref; gfc_ref *ref;
gfc_fix_class_refs (expr);
for (ref = expr->ref; ref; ref = ref->next) for (ref = expr->ref; ref; ref = ref->next)
if (ref->type == REF_ARRAY && ref->u.ar.type != AR_ELEMENT) if (ref->type == REF_ARRAY && ref->u.ar.type != AR_ELEMENT)
break; break;
......
2019-03-10 Thomas Koenig <tkoenig@gcc.gnu.org> 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 PR fortran/87734
* gfortran.dg/public_private_module_10.f90: New test. * gfortran.dg/public_private_module_10.f90: New test.
......
! { 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
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