http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41936
--- Comment #4 from Tobias Burnus <burnus at gcc dot gnu.org> ---
(In reply to Dominique d'Humieres from comment #3)
> + if ((expr->ts.type == BT_DERIVED || expr->ts.type == BT_CLASS)
> + && expr->ts.u.derived->attr.alloc_comp && expr->rank
> + && expr->expr_type != EXPR_VARIABLE)
> + {
> + tmp = build_fold_indirect_ref_loc (input_location, se->expr);
> + tmp = gfc_deallocate_alloc_comp (expr->ts.u.derived, tmp, expr->rank);
Calling gfc_deallocate_alloc_comp for BT_CLASS looks wrong. You have to call
the finalization wrapper - to ensure that not only the allocatable components
of the declared type but also the ones of the effective/actual type are
deallocated. Additionally, that ensure that user's finalizer is called when it
exists.
(For BT_DERIVED, you may also have to call the finalization wrapper - but only
if the type has finalizers.)