aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/parser.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2007-11-01 23:54:39 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2007-11-01 23:54:39 +0100
commite426bd2cc87fa44c6f2669f4d8b1c06458e3961a (patch)
tree9d8957fff01123e31aed20e5ddc810fd06a83738 /gcc/cp/parser.c
parent3a44f39543e5c76226975a7897e3e8669b934327 (diff)
downloadgcc-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/parser.c')
-rw-r--r--gcc/cp/parser.c13
1 files changed, 10 insertions, 3 deletions
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