[Fortran, DRAFT patch] PR 46321 - [OOP] Polymorphic deallocation
Alessandro Fanfarillo
fanfarillo.gcc@gmail.com
Mon Jun 11 10:12:00 GMT 2012
Thank you for the review, with this patch I get some ICEs during the
regstest with:
gfortran.dg/coarray/poly_run_3.f90
gfortran.dg/elemental_optional_args_5.f03
gfortran.dg/select_type_26.f03
gfortran.dg/select_type_27.f03
gfortran.dg/class_48.f90
gfortran.dg/class_allocate_10.f03
gfortran.dg/class_allocate_8.f03
gfortran.dg/class_array_1.f03
gfortran.dg/class_array_2.f03
gfortran.dg/assumed_type_2.f90
gfortran.dg/class_array_9.f03
gfortran.dg/coarray_lib_alloc_2.f90
I've debugged only the first 2 and the problem seems to be related
with "tmp = fold_build2_loc (input_location, NE_EXPR,
boolean_type_node, se.expr, build_int_cst (TREE_TYPE (se.expr), 0)); "
in trans-stmt.c at line 5376. The ICE message is the following:
$ gcc/bin/gfortran -c elemental_optional_args_5.f03
elemental_optional_args_5.f03: In function ‘MAIN__’:
elemental_optional_args_5.f03:220:0: internal compiler error: in
build_int_cst_wide, at tree.c:1219
deallocate (taa, tpa, caa, cpa)
^
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://gcc.gnu.org/bugs.html> for instructions.
2012/6/10 Tobias Burnus <burnus@net-b.de>:
> Alessandro Fanfarillo wrote:
>>
>> with the priceless support of Tobias I've almost realized the patch
>> for this PR. In attachment there's the second draft. During the
>> regression test I have only one error with select_type_4.f90. The
>> problem is in the destroy_list subroutine when it checks
>> associated(node) after the first deallocate(node).
>
>
> --- gcc/fortran/trans-stmt.c (revisione 188002)
> +++ gcc/fortran/trans-stmt.c (copia locale)
> @@ -5341,7 +5341,12 @@ gfc_trans_deallocate (gfc_code *code)
> for (al = code->ext.alloc.list; al != NULL; al = al->next)
> {
> - gfc_expr *expr = gfc_copy_expr (al->expr);
> + gfc_expr *expr;
> + gfc_expr *ppc;
> + gfc_code *ppc_code;
> + gfc_actual_arglist *actual;
> + expr = gfc_copy_expr (al->expr);
> + ppc = gfc_copy_expr (expr);
> ...
> + if (expr->symtree->n.sym->ts.type == BT_CLASS)
>
>
> I'd prefer:
>
> gfc_expr *ppc = NULL;
> ...
> if (expr->ts.type == BT_CLASS)
> ppc = gfc_copy_expr (expr);
> ...
> if (ppc)
> ...
>
> Namely: Only copy the expression if needed.
>
> Additionally, the check "if (expr->symtree->n.sym->ts.type == BT_CLASS)" is
> wrong. For instance, for
> type(t) :: x
> deallocate(x%class)
> it won't trigger, but it should.
>
> Actually, I think a cleaner version would be:
>
> if (al->expr->ts.type == BT_CLASS)
> {
> gfc_expr *ppc;
> ppc = gfc_copy_expr (al->expr);
>
> * * *
>
> Furthermore, I think you call _free + free for the same component for:
>
> type t
> integer, allocatable :: x
> end type t
> class(t), allocatable :: y
> ...
> deallocate (y)
>
> * * *
>
> Regarding your code: You assume that "al->expr" points to an allocated
> variable, that's not the always the case - hence, select_type_4.f90 fails.
>
> * * *
>
> You always create a _free function; I wonder whether it makes sense to use
> _vtab->free with NULL in case that no _free is needed.
>
> * * *
>
> Attached an updated version, which does that all. No guarantee that it works
> correctly, but it should at least fix select_type_4.f90.
>
> Tobias
More information about the Gcc-patches
mailing list