From: Jakub Jelinek Date: Wed, 12 Nov 2008 17:33:48 +0000 (+0100) Subject: re PR c++/34269 (Incomplete __decltype/__typeof expressions accepted) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=192657ec62c5bcda9b53987bd01444b23099be3b;p=gcc.git re PR c++/34269 (Incomplete __decltype/__typeof expressions accepted) PR c++/34269 * parser.c (cp_parser_simple_declaration): Don't commit to tentative parse if parse errors were seen. * g++.dg/cpp0x/decltype13.C: New test. * g++.dg/cpp0x/decltype-33837.C: Adjust dg-error pattern. * g++.dg/cpp0x/pr33839.C: Likewise. From-SVN: r141793 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 8cfdf61255e..c19dc815467 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2008-11-12 Jakub Jelinek + PR c++/34269 + * parser.c (cp_parser_simple_declaration): Don't commit + to tentative parse if parse errors were seen. + PR c++/35334 * error.c (dump_expr): Handle COMPLEX_EXPR. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index c819082c781..ec9624e69b2 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -8179,7 +8179,8 @@ cp_parser_simple_declaration (cp_parser* parser, (After "int (" we might be looking at a functional cast.) */ if (decl_specifiers.any_specifiers_p && cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_PAREN) - && cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_BRACE)) + && cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_BRACE) + && !cp_parser_error_occurred (parser)) cp_parser_commit_to_tentative_parse (parser); /* Keep going until we hit the `;' at the end of the simple diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index cd3752a741c..ab700dd9bb6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2008-11-12 Jakub Jelinek + PR c++/34269 + * g++.dg/cpp0x/decltype13.C: New test. + * g++.dg/cpp0x/decltype-33837.C: Adjust dg-error pattern. + * g++.dg/cpp0x/pr33839.C: Likewise. + PR target/35366 PR fortran/33759 * gfortran.dg/hollerith.f90: Don't assume a 32-bit value diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype-33837.C b/gcc/testsuite/g++.dg/cpp0x/decltype-33837.C index 35689fbc279..2c263dd0a97 100644 --- a/gcc/testsuite/g++.dg/cpp0x/decltype-33837.C +++ b/gcc/testsuite/g++.dg/cpp0x/decltype-33837.C @@ -2,6 +2,6 @@ // PR c++/33837 void foo() { - __decltype (A::foo()); // { dg-error "was not declared|expected initializer" } + __decltype (A::foo()); // { dg-error "was not declared|expected" } __decltype (B); // { dg-error "was not declared" } } diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype13.C b/gcc/testsuite/g++.dg/cpp0x/decltype13.C new file mode 100644 index 00000000000..8e6c6d2bf71 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype13.C @@ -0,0 +1,38 @@ +// PR c++/34269 +// { dg-do compile } + +void +f1 () +{ + __decltype; // { dg-error "expected" } +} + +void +f2 () +{ + __decltype (; // { dg-error "expected" } +} + +void +f3 () +{ + __decltype (); // { dg-error "expected" } +} + +void +f4 () +{ + __typeof__; // { dg-error "expected" } +} + +void +f5 () +{ + __typeof__ (; // { dg-error "expected" } +} + +void +f6 () +{ + __typeof__ (); // { dg-error "expected" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/pr33839.C b/gcc/testsuite/g++.dg/cpp0x/pr33839.C index 4111d6ccfc0..0a6610ac995 100644 --- a/gcc/testsuite/g++.dg/cpp0x/pr33839.C +++ b/gcc/testsuite/g++.dg/cpp0x/pr33839.C @@ -3,6 +3,6 @@ template struct A; void foo() { - __decltype A<0>; // { dg-error "invalid declarator" } + __decltype A<0>; // { dg-error "invalid declarator|expected" } __decltype (A<0>); // { dg-error "must be an expression" } }