diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/parser.c | 20 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/pr33839.C | 8 |
4 files changed, 30 insertions, 9 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index cabde87..191836d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2007-10-26 Douglas Gregor <doug.gregor@gmail.com> + + PR c++/33839 + * parser.c (cp_parser_decltype): Return ERROR_MARK_NODE if we + don't see the leading '('. Only lookup names if we get an + IDENTIFIER_NODE. + 2007-10-26 Jakub Jelinek <jakub@redhat.com> PR c++/33744 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 0b94375..2b73a85 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -8464,7 +8464,8 @@ cp_parser_decltype (cp_parser *parser) ++skip_evaluation; /* Parse the opening `('. */ - cp_parser_require (parser, CPP_OPEN_PAREN, "`('"); + if (!cp_parser_require (parser, CPP_OPEN_PAREN, "`('")) + return error_mark_node; /* First, try parsing an id-expression. */ cp_parser_parse_tentatively (parser); @@ -8482,14 +8483,15 @@ cp_parser_decltype (cp_parser *parser) cp_id_kind idk; const char *error_msg; - /* Lookup the name we got back from the id-expression. */ - expr = cp_parser_lookup_name (parser, expr, - none_type, - /*is_template=*/false, - /*is_namespace=*/false, - /*check_dependency=*/true, - /*ambiguous_decls=*/NULL); - + if (TREE_CODE (expr) == IDENTIFIER_NODE) + /* Lookup the name we got back from the id-expression. */ + expr = cp_parser_lookup_name (parser, expr, + none_type, + /*is_template=*/false, + /*is_namespace=*/false, + /*check_dependency=*/true, + /*ambiguous_decls=*/NULL); + if (expr && expr != error_mark_node && TREE_CODE (expr) != TEMPLATE_ID_EXPR diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0293ed0..1257d0b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2007-10-26 Douglas Gregor <doug.gregor@gmail.com> + + * g++.dg/cpp0x/pr33839.C: New. + 2007-10-26 Jakub Jelinek <jakub@redhat.com> PR c++/33744 diff --git a/gcc/testsuite/g++.dg/cpp0x/pr33839.C b/gcc/testsuite/g++.dg/cpp0x/pr33839.C new file mode 100644 index 0000000..4111d6c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr33839.C @@ -0,0 +1,8 @@ +// { dg-options -std=c++0x } +template<int> struct A; + +void foo() +{ + __decltype A<0>; // { dg-error "invalid declarator" } + __decltype (A<0>); // { dg-error "must be an expression" } +} |