diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 6e048cad8b969a251a64cf3512ac7d26a435593d..c044294eb110b7efdcc2173dd6cffcb37d7b70b6 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,11 @@
 2010-04-07  Jason Merrill  <jason@redhat.com>
 
+	* name-lookup.c (current_decl_namespace): Non-static.
+	(pop_nested_namespace): Sanity check.
+	* cp-tree.h: Declare current_decl_namespace.
+	* decl.c (grokvardecl): Use it instead of current_namespace.
+	(grokfndecl): Likewise.
+
 	PR c++/38392
 	* pt.c (tsubst_friend_function): Instatiate a friend that has already
 	been used.
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 1350619057aae79ebb52d30878cfe6c703cfa46c..f71317b602775e4fa23270efbf09308eef942036 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -4644,6 +4644,7 @@ extern tree pushdecl_top_level_and_finish	(tree, tree);
 extern tree check_for_out_of_scope_variable	(tree);
 extern void print_other_binding_stack		(struct cp_binding_level *);
 extern tree maybe_push_decl			(tree);
+extern tree current_decl_namespace		(void);
 
 /* decl.c */
 extern tree poplevel				(int, int, int);
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 4ae924b32ad42e72276c5d94efc1de57c1fb88eb..bfbe3ca5a733f725d537ad29267ddfa0f5611f86 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -6758,7 +6758,7 @@ grokfndecl (tree ctype,
   if (in_namespace)
     set_decl_namespace (decl, in_namespace, friendp);
   else if (!ctype)
-    DECL_CONTEXT (decl) = FROB_CONTEXT (current_namespace);
+    DECL_CONTEXT (decl) = FROB_CONTEXT (current_decl_namespace ());
 
   /* `main' and builtins have implicit 'C' linkage.  */
   if ((MAIN_NAME_P (declarator)
@@ -7020,7 +7020,7 @@ grokvardecl (tree type,
       /* An explicit "extern" specifier indicates a namespace-scope
 	 variable.  */
       if (declspecs->storage_class == sc_extern)
-	scope = current_namespace;
+	scope = current_decl_namespace ();
       else if (!at_function_scope_p ())
 	scope = current_scope ();
     }
diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c
index 7b43d30f47e8f58029bf6897b2dfff4a0029cc93..b4ac49f5c324a2e050033f6e716777b8c333dec5 100644
--- a/gcc/cp/name-lookup.c
+++ b/gcc/cp/name-lookup.c
@@ -3170,7 +3170,7 @@ set_decl_namespace (tree decl, tree scope, bool friendp)
 
 /* Return the namespace where the current declaration is declared.  */
 
-static tree
+tree
 current_decl_namespace (void)
 {
   tree result;
@@ -3342,6 +3342,7 @@ void
 pop_nested_namespace (tree ns)
 {
   timevar_push (TV_NAME_LOOKUP);
+  gcc_assert (current_namespace == ns);
   while (ns != global_namespace)
     {
       pop_namespace ();
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3df0787cc8bc78c41fad2eaabf128b8315fd42ef..4156ad4d3838ed7eb03a55b74afda9f98f32c432 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,7 @@
 2010-04-07  Jason Merrill  <jason@redhat.com>
 
+	* g++.dg/lookup/ns4.C: New.
+
 	PR c++/38392
 	* g++.dg/template/friend51.C: New test.
 
diff --git a/gcc/testsuite/g++.dg/lookup/ns4.C b/gcc/testsuite/g++.dg/lookup/ns4.C
new file mode 100644
index 0000000000000000000000000000000000000000..a28cda6cd4bdd41808d5672af9113f37f5fa7803
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/ns4.C
@@ -0,0 +1,20 @@
+// { dg-do link }
+
+namespace N {
+  void f();
+}
+
+void N::f()
+{
+  extern int i;
+  extern void g();
+  i = 1;
+  g();
+}
+
+namespace N {
+  int i;
+  void g() { }
+}
+
+int main() { }
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index 8bc03cc54ad06430319185971e024f424d97fb5f..0a46cf50d8167c64b059f749358d990819672f4a 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,3 +1,8 @@
+2010-04-07  Jason Merrill  <jason@redhat.com>
+
+	* gnu/gcj/runtime/natSharedLibLoader.cc (findCore): Move
+	declaration of _Jv_create_core out of the function.
+
 2010-04-02  Ralf Wildenhues  <Ralf.Wildenhues@gmx.de>
 
 	* Makefile.in: Regenerate.
diff --git a/libjava/gnu/gcj/runtime/natSharedLibLoader.cc b/libjava/gnu/gcj/runtime/natSharedLibLoader.cc
index 0d8d0e8341ba60a972b035fa659606ac7abc6ee2..fabdbcbe5263ab196597022592705a4d7cfa48c6 100644
--- a/libjava/gnu/gcj/runtime/natSharedLibLoader.cc
+++ b/libjava/gnu/gcj/runtime/natSharedLibLoader.cc
@@ -119,11 +119,14 @@ gnu::gcj::runtime::SharedLibHelper::hasResource (jstring name)
 #endif
 }
 
+#ifdef HAVE_DLOPEN
+extern gnu::gcj::Core *_Jv_create_core (_Jv_core_chain *node, jstring name);
+#endif
+
 gnu::gcj::Core *
 gnu::gcj::runtime::SharedLibHelper::findCore (jstring name)
 {
 #ifdef HAVE_DLOPEN
-  extern gnu::gcj::Core *_Jv_create_core (_Jv_core_chain *node, jstring name);
   ensureInit();
   return _Jv_create_core ((_Jv_core_chain *) core_chain, name);
 #else