diff options
Diffstat (limited to 'gcc/fortran/trans-decl.c')
-rw-r--r-- | gcc/fortran/trans-decl.c | 45 |
1 files changed, 43 insertions, 2 deletions
diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index 4e72a23..3d6a5e2 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -64,6 +64,10 @@ static GTY(()) tree saved_parent_function_decls; static struct pointer_set_t *nonlocal_dummy_decl_pset; static GTY(()) tree nonlocal_dummy_decls; +/* Holds the variable DECLs that are locals. */ + +static GTY(()) tree saved_local_decls; + /* The namespace of the module we're currently generating. Only used while outputting decls for module variables. Do not rely on this being set. */ @@ -180,6 +184,16 @@ gfc_add_decl_to_function (tree decl) saved_function_decls = decl; } +static void +add_decl_as_local (tree decl) +{ + gcc_assert (decl); + TREE_USED (decl) = 1; + DECL_CONTEXT (decl) = current_function_decl; + TREE_CHAIN (decl) = saved_local_decls; + saved_local_decls = decl; +} + /* Build a backend label declaration. Set TREE_USED for named labels. The context of the label is always the current_function_decl. All @@ -504,8 +518,11 @@ gfc_finish_var_decl (tree decl, gfc_symbol * sym) if (current_function_decl != NULL_TREE) { if (sym->ns->proc_name->backend_decl == current_function_decl - || sym->result == sym) + || sym->result == sym) gfc_add_decl_to_function (decl); + else if (sym->ns->proc_name->attr.flavor == FL_LABEL) + /* This is a BLOCK construct. */ + add_decl_as_local (decl); else gfc_add_decl_to_parent_function (decl); } @@ -3036,7 +3053,7 @@ init_intent_out_dt (gfc_symbol * proc_sym, tree body) Initialization and possibly repacking of dummy arrays. Initialization of ASSIGN statement auxiliary variable. */ -static tree +tree gfc_trans_deferred_vars (gfc_symbol * proc_sym, tree fnbody) { locus loc; @@ -4552,4 +4569,28 @@ gfc_generate_block_data (gfc_namespace * ns) } +/* Process the local variables of a BLOCK construct. */ + +void +gfc_process_block_locals (gfc_namespace* ns) +{ + tree decl; + + gcc_assert (saved_local_decls == NULL_TREE); + generate_local_vars (ns); + + decl = saved_local_decls; + while (decl) + { + tree next; + + next = TREE_CHAIN (decl); + TREE_CHAIN (decl) = NULL_TREE; + pushdecl (decl); + decl = next; + } + saved_local_decls = NULL_TREE; +} + + #include "gt-fortran-trans-decl.h" |