diff options
author | Jakub Jelinek <jakub@redhat.com> | 2007-11-01 23:54:39 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2007-11-01 23:54:39 +0100 |
commit | e426bd2cc87fa44c6f2669f4d8b1c06458e3961a (patch) | |
tree | 9d8957fff01123e31aed20e5ddc810fd06a83738 /gcc/cp | |
parent | 3a44f39543e5c76226975a7897e3e8669b934327 (diff) | |
download | gcc-e426bd2cc87fa44c6f2669f4d8b1c06458e3961a.zip gcc-e426bd2cc87fa44c6f2669f4d8b1c06458e3961a.tar.gz gcc-e426bd2cc87fa44c6f2669f4d8b1c06458e3961a.tar.bz2 |
re PR c++/32384 (Pseudo-dtor in template class rejected)
PR c++/32384
* parser.c (cp_parser_postfix_dot_deref_expression): If
POSTFIX_EXPRESSION is type dependent, try to parse it as pseudo dtor
first and if that succeeds and type is SCALAR_TYPE_P, create
PSEUDO_DTOR_EXPR.
* g++.dg/template/pseudodtor1.C: New test.
* g++.dg/template/pseudodtor2.C: New test.
From-SVN: r129836
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/parser.c | 13 |
2 files changed, 16 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c7946ac..51f219b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ 2007-11-01 Jakub Jelinek <jakub@redhat.com> + PR c++/32384 + * parser.c (cp_parser_postfix_dot_deref_expression): If + POSTFIX_EXPRESSION is type dependent, try to parse it as pseudo dtor + first and if that succeeds and type is SCALAR_TYPE_P, create + PSEUDO_DTOR_EXPR. + PR c++/32260 * rtti.c (enum_tinfo_kind): Fix TK_TYPE_INFO_TYPE comment. (typeid_ok_p): Use the same alias set for abi::__type_info_pseudo diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 2b73a85..7734cc1 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -4850,8 +4850,10 @@ cp_parser_postfix_dot_deref_expression (cp_parser *parser, pseudo_destructor_p = false; /* If the SCOPE is a scalar type, then, if this is a valid program, - we must be looking at a pseudo-destructor-name. */ - if (scope && SCALAR_TYPE_P (scope)) + we must be looking at a pseudo-destructor-name. If POSTFIX_EXPRESSION + is type dependent, it can be pseudo-destructor-name or something else. + Try to parse it as pseudo-destructor-name first. */ + if ((scope && SCALAR_TYPE_P (scope)) || dependent_p) { tree s; tree type; @@ -4860,7 +4862,12 @@ cp_parser_postfix_dot_deref_expression (cp_parser *parser, /* Parse the pseudo-destructor-name. */ s = NULL_TREE; cp_parser_pseudo_destructor_name (parser, &s, &type); - if (cp_parser_parse_definitely (parser)) + if (dependent_p + && (cp_parser_error_occurred (parser) + || TREE_CODE (type) != TYPE_DECL + || !SCALAR_TYPE_P (TREE_TYPE (type)))) + cp_parser_abort_tentative_parse (parser); + else if (cp_parser_parse_definitely (parser)) { pseudo_destructor_p = true; postfix_expression |