diff options
Diffstat (limited to 'gcc/fortran')
-rw-r--r-- | gcc/fortran/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/fortran/f95-lang.c | 10 | ||||
-rw-r--r-- | gcc/fortran/trans-decl.c | 19 |
3 files changed, 27 insertions, 11 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 53f3f0c1526..b0ef1cef8be 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,12 @@ +2008-10-07 Jakub Jelinek <jakub@redhat.com> + + * f95-lang.c (poplevel): Don't clear BLOCK_VARS if functionbody. + * trans-decl.c (gfc_build_qualified_array): Build accurate debug type + even if nest. + (build_entry_thunks, gfc_generate_function_code, + gfc_generate_constructors): Ensure DECL_SAVED_TREE is a BIND_EXPR + with DECL_INITIAL as its BLOCK. + 2008-10-05 Paul Thomas <pault@gcc.gnu.org> PR fortran/35680 diff --git a/gcc/fortran/f95-lang.c b/gcc/fortran/f95-lang.c index cf0dc2d48b7..a7d6c8f66a5 100644 --- a/gcc/fortran/f95-lang.c +++ b/gcc/fortran/f95-lang.c @@ -430,14 +430,8 @@ poplevel (int keep, int reverse, int functionbody) current_binding_level = current_binding_level->level_chain; if (functionbody) - { - /* This is the top level block of a function. The ..._DECL chain stored - in BLOCK_VARS are the function's parameters (PARM_DECL nodes). Don't - leave them in the BLOCK because they are found in the FUNCTION_DECL - instead. */ - DECL_INITIAL (current_function_decl) = block_node; - BLOCK_VARS (block_node) = 0; - } + /* This is the top level block of a function. */ + DECL_INITIAL (current_function_decl) = block_node; else if (current_binding_level == global_binding_level) /* When using gfc_start_block/gfc_finish_block from middle-end hooks, don't add newly created BLOCKs as subblocks of global_binding_level. */ diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index 20253e668ca..1b47f2673e6 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -704,7 +704,7 @@ gfc_build_qualified_array (tree decl, gfc_symbol * sym) layout_type (type); } - if (nest || write_symbols == NO_DEBUG) + if (write_symbols == NO_DEBUG) return; if (TYPE_NAME (type) != NULL_TREE @@ -1761,7 +1761,7 @@ build_entry_thunks (gfc_namespace * ns) thunk_fndecl = thunk_sym->backend_decl; - gfc_start_block (&body); + gfc_init_block (&body); /* Pass extra parameter identifying this entry point. */ tmp = build_int_cst (gfc_array_index_type, el->id); @@ -1869,8 +1869,12 @@ build_entry_thunks (gfc_namespace * ns) /* Finish off this function and send it for code generation. */ DECL_SAVED_TREE (thunk_fndecl) = gfc_finish_block (&body); + tmp = getdecls (); poplevel (1, 0, 1); BLOCK_SUPERCONTEXT (DECL_INITIAL (thunk_fndecl)) = thunk_fndecl; + DECL_SAVED_TREE (thunk_fndecl) + = build3_v (BIND_EXPR, tmp, DECL_SAVED_TREE (thunk_fndecl), + DECL_INITIAL (thunk_fndecl)); /* Output the GENERIC tree. */ dump_function (TDI_original, thunk_fndecl); @@ -3652,7 +3656,7 @@ gfc_generate_function_code (gfc_namespace * ns) trans_function_start (sym); - gfc_start_block (&block); + gfc_init_block (&block); if (ns->entries && ns->proc_name->ts.type == BT_CHARACTER) { @@ -3886,11 +3890,16 @@ gfc_generate_function_code (gfc_namespace * ns) saved_function_decls = NULL_TREE; DECL_SAVED_TREE (fndecl) = gfc_finish_block (&block); + decl = getdecls (); /* Finish off this function and send it for code generation. */ poplevel (1, 0, 1); BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl; + DECL_SAVED_TREE (fndecl) + = build3_v (BIND_EXPR, decl, DECL_SAVED_TREE (fndecl), + DECL_INITIAL (fndecl)); + /* Output the GENERIC tree. */ dump_function (TDI_original, fndecl); @@ -3969,9 +3978,13 @@ gfc_generate_constructors (void) DECL_SAVED_TREE (fndecl) = build_stmt (EXPR_STMT, tmp); } + decl = getdecls (); poplevel (1, 0, 1); BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl; + DECL_SAVED_TREE (fndecl) + = build3_v (BIND_EXPR, decl, DECL_SAVED_TREE (fndecl), + DECL_INITIAL (fndecl)); free_after_parsing (cfun); free_after_compilation (cfun); |