From bd9c7fb90927f0f22e6bbbb5f809bb8e5f6eaa95 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Mon, 30 Aug 2010 16:30:41 +0000 Subject: [PATCH] utils.c (gnat_pushdecl): Remove test for PARM_DECLs. * gcc-interface/utils.c (gnat_pushdecl): Remove test for PARM_DECLs. Attach fake PARM_DECLs to the topmost block of the function. From-SVN: r163651 --- gcc/ada/ChangeLog | 5 +++++ gcc/ada/gcc-interface/utils.c | 21 +++++++++++---------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 076efea4c710..86226afd44b5 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,8 @@ +2010-08-30 Eric Botcazou + + * gcc-interface/utils.c (gnat_pushdecl): Remove test for PARM_DECLs. + Attach fake PARM_DECLs to the topmost block of the function. + 2010-08-30 Eric Botcazou * gcc-interface/trans.c (call_to_gnu): Also force the return slot opt diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c index cef72322e1b0..c3a39d443578 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 ();