diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 700b99241ea95da05ca59c20c7b5e7125a6c5faa..e9cfad72a4bf392c1c2a0b82a485f2beb49e1fe2 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+2005-12-13  Petr Machata  <machata@post.cz>
+
+	PR c++/24907
+	* parser.c (cp_parser_simple_declaration): Require comma at the
+	beginning of processing second and later declarators, instead of
+	allowing the comma at the end of each iteration.
+
 2005-12-12  Mark Mitchell  <mark@codesourcery.com>
 
 	PR c++/25300
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 8eb4fbfcf290f7de7013ac56dfdd9db9383e6e55..25488c725408277547e800504d8d20b711b5e910 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -7145,7 +7145,16 @@ cp_parser_simple_declaration (cp_parser* parser,
       bool function_definition_p;
       tree decl;
 
-      saw_declarator = true;
+      if (saw_declarator)
+	{
+	  /* If we are processing next declarator, coma is expected */
+	  token = cp_lexer_peek_token (parser->lexer);
+	  gcc_assert (token->type == CPP_COMMA);
+	  cp_lexer_consume_token (parser->lexer);
+	}
+      else
+	saw_declarator = true;
+
       /* Parse the init-declarator.  */
       decl = cp_parser_init_declarator (parser, &decl_specifiers,
 					function_definition_allowed_p,
@@ -7180,7 +7189,7 @@ cp_parser_simple_declaration (cp_parser* parser,
       token = cp_lexer_peek_token (parser->lexer);
       /* If it's a `,', there are more declarators to come.  */
       if (token->type == CPP_COMMA)
-	cp_lexer_consume_token (parser->lexer);
+	/* will be consumed next time around */;
       /* If it's a `;', we are done.  */
       else if (token->type == CPP_SEMICOLON)
 	break;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9bde74d9640a7ea548acdf4cdf552fcc38c817ec..ce14f6a9b4a4f3932ddf84553016845c78b8eb45 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2005-12-13  Petr Machata  <machata@post.cz>
+
+	PR c++/24907
+	* g++.dg/parse/comma2.C: New test.
+
 2005-12-13  Mark Mitchell  <mark@codesourcery.com>
 	    Jakub Jelinek  <jakub@redhat.com>
 
diff --git a/gcc/testsuite/g++.dg/parse/comma2.C b/gcc/testsuite/g++.dg/parse/comma2.C
new file mode 100644
index 0000000000000000000000000000000000000000..0f405876d5753759c74aa7eaf78cffd63d47b0ba
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/comma2.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+
+// Copyright (C) 2005 Free Software Foundation, Inc.
+
+// PR c++/24907 [3.4/4.0/4.1/4.2 Regression] "int x, ;" accepted
+
+int x;
+int y,; /* { dg-error "expected" } */
+
+int main()
+{
+  int a;
+  int b,;    /* { dg-error "expected" } */
+  int c,d;
+  int e,f,;  /* { dg-error "expected" } */
+  int g,h,i;
+  int j,k,l,;/* { dg-error "expected" } */
+  int m,,,n; /* { dg-error "expected" } */
+}