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