diff options
Diffstat (limited to 'gcc/ada/gcc-interface/utils.c')
-rw-r--r-- | gcc/ada/gcc-interface/utils.c | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c index cef7232..c3a39d4 100644 --- a/gcc/ada/gcc-interface/utils.c +++ b/gcc/ada/gcc-interface/utils.c @@ -418,11 +418,8 @@ gnat_poplevel (void) void gnat_pushdecl (tree decl, Node_Id gnat_node) { - /* If this decl is public external or at toplevel, there is no context. - But PARM_DECLs always go in the level of its function. */ - if (TREE_CODE (decl) != PARM_DECL - && ((DECL_EXTERNAL (decl) && TREE_PUBLIC (decl)) - || global_bindings_p ())) + /* If this decl is public external or at toplevel, there is no context. */ + if ((TREE_PUBLIC (decl) && DECL_EXTERNAL (decl)) || global_bindings_p ()) DECL_CONTEXT (decl) = 0; else { @@ -461,8 +458,14 @@ gnat_pushdecl (tree decl, Node_Id gnat_node) } else { - DECL_CHAIN (decl) = BLOCK_VARS (current_binding_level->block); - BLOCK_VARS (current_binding_level->block) = decl; + tree block; + /* Fake PARM_DECLs go into the topmost block of the function. */ + if (TREE_CODE (decl) == PARM_DECL) + block = BLOCK_SUPERCONTEXT (current_binding_level->block); + else + block = current_binding_level->block; + DECL_CHAIN (decl) = BLOCK_VARS (block); + BLOCK_VARS (block) = decl; } } @@ -1878,9 +1881,7 @@ end_subprog_body (tree body) { tree fndecl = current_function_decl; - /* Mark the BLOCK for this level as being for this function and pop the - level. Since the vars in it are the parameters, clear them. */ - BLOCK_VARS (current_binding_level->block) = NULL_TREE; + /* Attach the BLOCK for this level to the function and pop the level. */ BLOCK_SUPERCONTEXT (current_binding_level->block) = fndecl; DECL_INITIAL (fndecl) = current_binding_level->block; gnat_poplevel (); |