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
This commit is contained in:
parent
3a44f39543
commit
e426bd2cc8
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -1,5 +1,9 @@
|
|||
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
|
||||
* g++.dg/rtti/typeid7.C: New test.
|
||||
|
||||
|
|
|
@ -0,0 +1,44 @@
|
|||
// 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;
|
|
@ -0,0 +1,18 @@
|
|||
// 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;
|
Loading…
Reference in New Issue