https://gcc.gnu.org/bugzilla/show_bug.cgi?id=128093

--- Comment #3 from Paul Thomas <pault at gcc dot gnu.org> ---
              init_expr->param_list = NULL;
>             gfc_replace_expr (init_expr, var);
>             /* Deallocate temporary PDT's allocatable components.  */
> -           if (var->symtree->n.sym->ts.u.derived->attr.alloc_comp)
> +           if (init_expr->symtree->n.sym->ts.u.derived->attr.alloc_comp)
>               {
> -               tree var_decl = gfc_get_symbol_decl (var->symtree->n.sym);
> -               tmp = gfc_deallocate_pdt_comp 
> (var->symtree->n.sym->ts.u.derived,
> +               tree var_decl = gfc_get_symbol_decl 
> (init_expr->symtree->n.sym);
> +               tmp = gfc_deallocate_pdt_comp 
> (init_expr->symtree->n.sym->ts.u.derived,
>                                               var_decl, 0);
>                 gfc_add_expr_to_block (&block, tmp);
>               }

Iain,

The current state should not have worked on any platform IMHO.

Moving gfc_replace_expr (init_expr, var); to after the deallocation of PDT
components fixes the problem too, does it not?

diff --git a/gcc/fortran/trans-stmt.cc b/gcc/fortran/trans-stmt.cc
index 65bf2ec9d93..2c0b64a8dcf 100644
--- a/gcc/fortran/trans-stmt.cc
+++ b/gcc/fortran/trans-stmt.cc
@@ -7818,6 +7818,7 @@ gfc_trans_allocate (gfc_code * code, gfc_omp_namelist
*omp_allocate)
            {
              gfc_expr *var;
              tree decl;
+             gfc_symbol *derived;
              var = gfc_get_temp_from_expr (init_expr, gfc_current_ns, false);
              decl = gfc_get_symbol_decl (var->symtree->n.sym);
              tmp = gfc_allocate_pdt_comp (init_expr->ts.u.derived, decl,
@@ -7829,11 +7830,12 @@ gfc_trans_allocate (gfc_code * code, gfc_omp_namelist
*omp_allocate)
              init_expr->param_list = NULL;
              gfc_replace_expr (init_expr, var);
              /* Deallocate temporary PDT's allocatable components.  */
-             if (var->symtree->n.sym->ts.u.derived->attr.alloc_comp)
+             derived = expr->symtree->n.sym->ts.u.derived;
+             if (derived->attr.alloc_comp)
                {
-                 tree var_decl = gfc_get_symbol_decl (var->symtree->n.sym);
-                 tmp = gfc_deallocate_pdt_comp
(var->symtree->n.sym->ts.u.derived,
-                                               var_decl, 0);
+                 tree var_decl
+                       = gfc_get_symbol_decl (init_expr->symtree->n.sym);
+                 tmp = gfc_deallocate_pdt_comp (derived, var_decl, 0);
                  gfc_add_expr_to_block (&block, tmp);
                }
            }

Regtesting right now.

Paul

Reply via email to