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.)