diff options
author | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-02-13 22:30:43 +0000 |
---|---|---|
committer | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-02-13 22:30:43 +0000 |
commit | d1cc306042aa8108c5aa765b4e3e1eeb5a288f94 (patch) | |
tree | 56624ad6c8c3f66c15331fc37d14bb94a8e52ccd /gcc/cp | |
parent | e03409d8c6d041c02bade1f682af9fafd694cafb (diff) | |
download | gcc-d1cc306042aa8108c5aa765b4e3e1eeb5a288f94.tar.gz |
PR c++/35138
* parser.c (cp_parser_pseudo_destructor_name): If next tokens
are not identifier :: ~, return before calling cp_parser_type_name.
* g++.dg/template/member8.C: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@132298 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/parser.c | 26 |
2 files changed, 21 insertions, 12 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 38f951032e6..c237abda40d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2008-02-13 Jakub Jelinek <jakub@redhat.com> + Manuel Lopez-Ibanez <manu@gcc.gnu.org> + + PR c++/35138 + * parser.c (cp_parser_pseudo_destructor_name): If next tokens + are not identifier :: ~, return before calling cp_parser_type_name. + 2008-02-13 Jason Merrill <jason@redhat.com> PR c++/34962, c++/34937, c++/34939 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index a6489832d11..5f215742d49 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -5164,24 +5164,26 @@ cp_parser_pseudo_destructor_name (cp_parser* parser, additional qualification. */ else if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMPL)) { + /* At this point, we're looking for "type-name :: ~". The type-name + must not be a class-name, since this is a pseudo-destructor. So, + it must be either an enum-name, or a typedef-name -- both of which + are just identifiers. So, we peek ahead to check that the "::" + and "~" tokens are present; if they are not, then we can avoid + calling type_name. */ + if (cp_lexer_peek_token (parser->lexer)->type != CPP_NAME + || cp_lexer_peek_nth_token (parser->lexer, 2)->type != CPP_SCOPE + || cp_lexer_peek_nth_token (parser->lexer, 3)->type != CPP_COMPL) + { + cp_parser_error (parser, "non-scalar type"); + return; + } + /* Look for the type-name. */ *scope = TREE_TYPE (cp_parser_type_name (parser)); if (*scope == error_mark_node) return; - /* If we don't have ::~, then something has gone wrong. Since - the only caller of this function is looking for something - after `.' or `->' after a scalar type, most likely the - program is trying to get a member of a non-aggregate - type. */ - if (cp_lexer_next_token_is_not (parser->lexer, CPP_SCOPE) - || cp_lexer_peek_nth_token (parser->lexer, 2)->type != CPP_COMPL) - { - cp_parser_error (parser, "request for member of non-aggregate type"); - return; - } - /* Look for the `::' token. */ cp_parser_require (parser, CPP_SCOPE, "`::'"); } |