aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2008-10-07 20:15:32 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2008-10-07 20:15:32 +0200
commitc7c79a09d6abdcfe54b67c54374ca538665152c5 (patch)
tree2678f9917d4d74b4f583c1caea68711e28016389 /gcc
parenta107f086365bc6adb37c6d81f029af3d7fc73c52 (diff)
downloadgcc-c7c79a09d6abdcfe54b67c54374ca538665152c5.zip
gcc-c7c79a09d6abdcfe54b67c54374ca538665152c5.tar.gz
gcc-c7c79a09d6abdcfe54b67c54374ca538665152c5.tar.bz2
f95-lang.c (poplevel): Don't clear BLOCK_VARS if functionbody.
* 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. From-SVN: r140945
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog9
-rw-r--r--gcc/fortran/f95-lang.c10
-rw-r--r--gcc/fortran/trans-decl.c19
3 files changed, 27 insertions, 11 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 53f3f0c..b0ef1ce 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 cf0dc2d..a7d6c8f 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 20253e6..1b47f267 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);