diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5b2e01a6f67607bc921fac70a8324202a5fb0d08..72fd7ae770bd3cf5c486f2e566164f66a768d16a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2003-10-08  Timo Kokkonen  <tjko@iki.fi>
+            Eric Botcazou  <ebotcazou@libertysurf.fr>
+
+	PR bootstrap/12490
+	* scan-decls.c (MAX_EXTERN_C_BRACES): New preprocessor constant
+	to define the size of the extern_C_braces array.  Set it to 200.
+	(scan_decls): Abort when extern_C_braces_length is out-of-bounds.
+
 2003-10-08  Carlo Wood  <carlo@alinoe.com>
 
 	* Makefile.in (gengtype-lex.c): flex 2.5.4[a] doesn't understand
diff --git a/gcc/scan-decls.c b/gcc/scan-decls.c
index 14f64e8cb2e175f9ca678a410ddaa16e09c38e5f..ebd69cb05c1152a9bfc2cb53c4778ef31b756ddf 100644
--- a/gcc/scan-decls.c
+++ b/gcc/scan-decls.c
@@ -34,7 +34,9 @@ int brace_nesting = 0;
    indicate the (brace nesting levels of) left braces that were
    prefixed by extern "C".  */
 int extern_C_braces_length = 0;
-char extern_C_braces[20];
+/* 20 is not enough anymore on Solaris 9.  */
+#define MAX_EXTERN_C_BRACES  200
+char extern_C_braces[MAX_EXTERN_C_BRACES];
 #define in_extern_C_brace (extern_C_braces_length>0)
 
 /* True if the function declaration currently being scanned is
@@ -220,6 +222,12 @@ scan_decls (cpp_reader *pfile, int argc ATTRIBUTE_UNUSED,
 		      brace_nesting++;
 		      extern_C_braces[extern_C_braces_length++]
 			= brace_nesting;
+		      if (extern_C_braces_length >= MAX_EXTERN_C_BRACES)
+			{
+			  fprintf (stderr,
+			  	   "Internal error: out-of-bounds index\n");
+			  exit (FATAL_EXIT_CODE);
+			}
 		      goto new_statement;
 		    }
 		}