diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 0e3c6fe0d9dc16e6c3b9cc596ee86c4a71c2defd..e5d86a99f052f178bd451d601cb06fc49ff4b7ac 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,8 @@
 1999-04-05  Mark Mitchell  <mark@codesourcery.com>
 
+	* decl.c (lookup_name_current_level): Tweak, and improve
+	documentation.
+
 	* class.c (maybe_fixup_vptrs): Remove declaration.
 	(build_class_init_list): Likewise.
 	* decl.c (pushdecl_class_level): Call check_template_shadow here
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 0372daedbfc145d984f5535e54764bf93b631903..098923768801c3d766c220b81d15d3ee88736b53 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -5727,15 +5727,21 @@ lookup_name (name, prefer_type)
   return lookup_name_real (name, prefer_type, 0, 0);
 }
 
-/* Similar to `lookup_name' but look only at current binding level.  */
+/* Similar to `lookup_name' but look only in the innermost non-class
+   binding level.  */
 
 tree
 lookup_name_current_level (name)
      tree name;
 {
-  register tree t = NULL_TREE;
+  struct binding_level *b;
+  tree t = NULL_TREE;
+
+  b = current_binding_level;
+  while (b->parm_flag == 2)
+    b = b->level_chain;
 
-  if (current_binding_level->namespace_p)
+  if (b->namespace_p)
     {
       t =  IDENTIFIER_NAMESPACE_VALUE (name);
 
@@ -5746,8 +5752,6 @@ lookup_name_current_level (name)
   else if (IDENTIFIER_BINDING (name) 
 	   && LOCAL_BINDING_P (IDENTIFIER_BINDING (name)))
     {
-      struct binding_level *b = current_binding_level;
-
       while (1)
 	{
 	  if (BINDING_LEVEL (IDENTIFIER_BINDING (name)) == b)
diff --git a/gcc/testsuite/g++.old-deja/g++.other/crash8.C b/gcc/testsuite/g++.old-deja/g++.other/crash8.C
new file mode 100644
index 0000000000000000000000000000000000000000..22b27ef9b1207f8c0f7caaf5c07c037d46e1c56d
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.other/crash8.C
@@ -0,0 +1,10 @@
+// Build don't link:
+// Origin: Jason Merrill <jason@cygnus.com>
+
+int main()
+{
+  void f();
+  class A {
+    friend void f();
+  };
+}