diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 75ea230839045073ce1845092306654a1439d337..ccc942e32f7465bc30044c4c2c4936aff0a014dd 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2002-12-30  David Edelsohn  <edelsohn@gnu.org>
+
+	* parser.c (cp_parser_parameter_declaration_clause): Treat system
+	header as extern "C" if NO_IMPLICIT_EXTERN_C undefined.
+
 2002-12-30  Nathanael Nerode  <neroden@gcc.gnu.org>
 
 	* config-lang.in, Make-lang.in, operators.def, cp-tree.def:  
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 70bf5eff4ba21ba2aae02d66ae9511009f76f8ba..94742504145d90b0eee75ab7efc57f290a46dd1a 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -10558,7 +10558,15 @@ cp_parser_parameter_declaration_clause (parser)
     }
   else if (token->type == CPP_CLOSE_PAREN)
     /* There are no parameters.  */
-    return void_list_node;
+    {
+#ifndef NO_IMPLICIT_EXTERN_C
+      if (in_system_header && current_class_type == NULL
+	  && current_lang_name == lang_name_c)
+	return NULL_TREE;
+      else
+#endif
+	return void_list_node;
+    }
   /* Check for `(void)', too, which is a special case.  */
   else if (token->keyword == RID_VOID
 	   && (cp_lexer_peek_nth_token (parser->lexer, 2)->type