Commit e426bd2c by Jakub Jelinek Committed by Jakub Jelinek

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
parent 3a44f395
2007-11-01 Jakub Jelinek <jakub@redhat.com> 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 PR c++/32260
* rtti.c (enum_tinfo_kind): Fix TK_TYPE_INFO_TYPE comment. * rtti.c (enum_tinfo_kind): Fix TK_TYPE_INFO_TYPE comment.
(typeid_ok_p): Use the same alias set for abi::__type_info_pseudo (typeid_ok_p): Use the same alias set for abi::__type_info_pseudo
......
...@@ -4850,8 +4850,10 @@ cp_parser_postfix_dot_deref_expression (cp_parser *parser, ...@@ -4850,8 +4850,10 @@ cp_parser_postfix_dot_deref_expression (cp_parser *parser,
pseudo_destructor_p = false; pseudo_destructor_p = false;
/* If the SCOPE is a scalar type, then, if this is a valid program, /* If the SCOPE is a scalar type, then, if this is a valid program,
we must be looking at a pseudo-destructor-name. */ we must be looking at a pseudo-destructor-name. If POSTFIX_EXPRESSION
if (scope && SCALAR_TYPE_P (scope)) 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 s;
tree type; tree type;
...@@ -4860,7 +4862,12 @@ cp_parser_postfix_dot_deref_expression (cp_parser *parser, ...@@ -4860,7 +4862,12 @@ cp_parser_postfix_dot_deref_expression (cp_parser *parser,
/* Parse the pseudo-destructor-name. */ /* Parse the pseudo-destructor-name. */
s = NULL_TREE; s = NULL_TREE;
cp_parser_pseudo_destructor_name (parser, &s, &type); 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; pseudo_destructor_p = true;
postfix_expression postfix_expression
......
2007-11-01 Jakub Jelinek <jakub@redhat.com> 2007-11-01 Jakub Jelinek <jakub@redhat.com>
PR c++/32384
* g++.dg/template/pseudodtor1.C: New test.
* g++.dg/template/pseudodtor2.C: New test.
PR c++/32260 PR c++/32260
* g++.dg/rtti/typeid7.C: New test. * g++.dg/rtti/typeid7.C: New test.
// PR c++/32384
// { dg-do compile }
struct A
{
typedef int T;
T foo ();
A () { foo ().~T (); }
};
template<typename> struct B
{
typedef int T;
T foo ();
B () { foo ().~T (); }
};
template<typename T> struct C
{
T t;
C () { t.~T (); }
};
template<typename S> struct D
{
typedef int T;
S foo ();
D () { foo ().~T(); }
};
struct Z
{
Z () {}
~Z () {}
};
A a;
B<int> b;
C<int> c1;
C<Z> c2;
D<int> d;
// PR c++/32384
// { dg-do compile }
template<typename S> struct D
{
typedef int T;
S foo ();
D () { foo ().~T(); } // { dg-error "is not of type" }
};
struct Z
{
Z () {}
~Z () {}
};
D<Z> d;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment