diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index df4f2b161164c69c7936f0e529a78f1956780346..37c1db7e3fcf3f215572e63d80ce10fc55634c1d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2003-01-02  Jason Merrill  <jason@redhat.com>
+
+	* c-common.c (finish_fname_decls): Put the DECL_STMTs inside the
+	outermost scope.
+	* c-decl.c (c_make_fname_decl): Push the decls there, too.
+
 2003-01-03  Kazu Hirata  <kazu@cs.umass.edu>
 
 	* config/h8300/h8300-protos.h: Add a prototype for
diff --git a/gcc/c-common.c b/gcc/c-common.c
index 79502d2fde8f96fecdc355e22882d11eafeedb04..12cacab3d55996a932177ca206c96ab79997bcb5 100644
--- a/gcc/c-common.c
+++ b/gcc/c-common.c
@@ -1050,13 +1050,18 @@ finish_fname_decls ()
   
   if (body)
     {
-      /* They were called into existence, so add to statement tree.  */
-      body = chainon (body,
-		      TREE_CHAIN (DECL_SAVED_TREE (current_function_decl)));
-      body = build_stmt (COMPOUND_STMT, body);
-      
-      COMPOUND_STMT_NO_SCOPE (body) = 1;
-      TREE_CHAIN (DECL_SAVED_TREE (current_function_decl)) = body;
+      /* They were called into existence, so add to statement tree.  Add
+	 the DECL_STMTs inside the outermost scope.  */
+      tree *p = &DECL_SAVED_TREE (current_function_decl);
+      /* Skip the dummy EXPR_STMT and any EH_SPEC_BLOCK.  */
+      while (TREE_CODE (*p) != COMPOUND_STMT)
+	p = &TREE_CHAIN (*p);
+      p = &COMPOUND_BODY (*p);
+      if (TREE_CODE (*p) == SCOPE_STMT)
+	p = &TREE_CHAIN (*p);
+
+      body = chainon (body, *p);
+      *p = body;
     }
   
   for (ix = 0; fname_vars[ix].decl; ix++)
@@ -1079,7 +1084,7 @@ finish_fname_decls ()
   saved_function_name_decls = stack;
 }
 
-/* Return the text name of the current function, suitable prettified
+/* Return the text name of the current function, suitably prettified
    by PRETTY_P.  */
 
 const char *
@@ -1163,7 +1168,7 @@ fname_decl (rid, id)
     }
   if (!ix && !current_function_decl)
     pedwarn_with_decl (decl, "`%s' is not defined outside of function scope");
-  
+
   return decl;
 }
 
diff --git a/gcc/c-decl.c b/gcc/c-decl.c
index 8c86bc0d87a5a39c6e688356c517711350652d9b..fde8c482e12e6ef85a3ea8d1b779817013690bd8 100644
--- a/gcc/c-decl.c
+++ b/gcc/c-decl.c
@@ -2545,6 +2545,18 @@ c_make_fname_decl (id, type_dep)
   DECL_INITIAL (decl) = init;
 
   TREE_USED (decl) = 1;
+
+  if (current_function_decl)
+    {
+      /* Add the decls to the outermost block.  */
+      struct binding_level *b = current_binding_level;
+      struct binding_level *old = b;
+      while (b->level_chain->parm_flag == 0)
+	b = b->level_chain;
+      current_binding_level = b;
+      pushdecl (decl);
+      current_binding_level = old;
+    }	
   
   finish_decl (decl, init, NULL_TREE);
 
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 9be11475fd98d863332f349434224a5b866c0c92..dad9680fe90d05bf4bd9e553b7ba23136bb6f82e 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2003-01-02  Jason Merrill  <jason@redhat.com>
+
+	* decl.c (cp_make_fname_decl): Push the decls inside the
+	outermost scope.
+
 2003-01-03  Nathan Sidwell  <nathan@codesourcery.com>
 
 	PR c++/45, c++/3784
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index aaf426294e1c5f7cc99a85d74ee639758668acf2..ed200092777d2f00f116b75d301a73745b8d7014 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -6656,7 +6656,7 @@ cp_make_fname_decl (id, type_dep)
   tree init = cp_fname_init (name);
   tree decl = build_decl (VAR_DECL, id, TREE_TYPE (init));
 
-  /* As we don't push the decl here, we must set the context.  */
+  /* As we're using pushdecl_with_scope, we must set the context.  */
   DECL_CONTEXT (decl) = current_function_decl;
   DECL_PRETTY_FUNCTION_P (decl) = type_dep;
       
@@ -6667,6 +6667,14 @@ cp_make_fname_decl (id, type_dep)
   
   TREE_USED (decl) = 1;
 
+  if (current_function_decl)
+    {
+      struct cp_binding_level *b = current_binding_level;
+      while (b->level_chain->parm_flag == 0)
+	b = b->level_chain;
+      pushdecl_with_scope (decl, b);
+    }	
+
   cp_finish_decl (decl, init, NULL_TREE, LOOKUP_ONLYCONVERTING);
       
   return decl;