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" } */ +}