On 06/11/2012 11:24 AM, Alessandro Fanfarillo wrote:
gfortran.dg/coarray/poly_run_3.f90

That one fails because I for forgot that se.expr in gfc_trans_deallocate contains the descriptor and not the pointer to the data. That's fixed by:

          tmp = se.expr;
          if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (tmp)))
            {
              tmp = gfc_conv_descriptor_data_get (tmp);
              STRIP_NOPS (tmp);
            }
tmp = fold_build2_loc (input_location, NE_EXPR, boolean_type_node,
                                  tmp, build_int_cst (TREE_TYPE (tmp), 0));

However, it still fails for the

type t
  integer, allocatable :: comp
end type t
contains
  subroutine foo(x)
    class(t), allocatable, intent(out) :: x(:)
  end subroutine
end

(The intent(out) causes automatic deallocation.) The backtrace does not really point to some code which the patch touched; it shouldn't be affected by the class.c changes and gfc_trans_deallocate does not seem to be entered.

While I do not immediately see why it fails, I wonder whether it is due to the removed "else if ... BT_CLASS)" case in gfc_deallocate_scalar_with_status. In any case, the change to gfc_trans_deallocate might be also needed for gfc_deallocate_scalar_with_status. At least, automatic deallocation (with intent(out) or when leaving the scope) does not seem to go through gfc_trans_deallocate but only through gfc_deallocate_scalar_with_status.

Tobias

Reply via email to