diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ada/ChangeLog | 5 | ||||
-rw-r--r-- | 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 076efea..86226af 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,5 +1,10 @@ 2010-08-30 Eric Botcazou <ebotcazou@adacore.com> + * 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 <ebotcazou@adacore.com> + * gcc-interface/trans.c (call_to_gnu): Also force the return slot opt for the call to a function whose return type was unconstrained. 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 (); |