Commit 3d9b2eb6 by Jakub Jelinek Committed by Jakub Jelinek

re PR c++/32241 (ICE trying to call x.~X(); in a template)

	PR c++/32241
	* pt.c (tsubst_copy_and_build) <case COMPONENT_REF>: If object_type
	is not scalar type, let finish_class_member_access_expr handle
	diagnostics.  Pass BIT_NOT_EXPR argument to
	finish_pseudo_destructor_expr.  Handle SCOPE_REF properly.

	* g++.dg/template/pseudodtor3.C: New test.

From-SVN: r130066
parent 49b5e2f6
2007-11-10 Jakub Jelinek <jakub@redhat.com>
PR c++/32241
* pt.c (tsubst_copy_and_build) <case COMPONENT_REF>: If object_type
is not scalar type, let finish_class_member_access_expr handle
diagnostics. Pass BIT_NOT_EXPR argument to
finish_pseudo_destructor_expr. Handle SCOPE_REF properly.
2007-11-09 Douglas Gregor <doug.gregor@gmail.com> 2007-11-09 Douglas Gregor <doug.gregor@gmail.com>
PR c++/33510 PR c++/33510
......
...@@ -11004,15 +11004,23 @@ tsubst_copy_and_build (tree t, ...@@ -11004,15 +11004,23 @@ tsubst_copy_and_build (tree t,
if (object_type && !CLASS_TYPE_P (object_type)) if (object_type && !CLASS_TYPE_P (object_type))
{ {
if (TREE_CODE (member) == BIT_NOT_EXPR) if (SCALAR_TYPE_P (object_type))
return finish_pseudo_destructor_expr (object, {
NULL_TREE, tree s = NULL_TREE;
object_type); tree dtor = member;
else if (TREE_CODE (member) == SCOPE_REF
&& (TREE_CODE (TREE_OPERAND (member, 1)) == BIT_NOT_EXPR)) if (TREE_CODE (dtor) == SCOPE_REF)
return finish_pseudo_destructor_expr (object, {
object, s = TREE_OPERAND (dtor, 0);
object_type); dtor = TREE_OPERAND (dtor, 1);
}
if (TREE_CODE (dtor) == BIT_NOT_EXPR)
{
dtor = TREE_OPERAND (dtor, 0);
if (TYPE_P (dtor))
return finish_pseudo_destructor_expr (object, s, dtor);
}
}
} }
else if (TREE_CODE (member) == SCOPE_REF else if (TREE_CODE (member) == SCOPE_REF
&& TREE_CODE (TREE_OPERAND (member, 1)) == TEMPLATE_ID_EXPR) && TREE_CODE (TREE_OPERAND (member, 1)) == TEMPLATE_ID_EXPR)
......
2007-11-10 Jakub Jelinek <jakub@redhat.com>
PR c++/32241
* g++.dg/template/pseudodtor3.C: New test.
2007-11-09 Douglas Gregor <doug.gregor@gmail.com> 2007-11-09 Douglas Gregor <doug.gregor@gmail.com>
PR c++/33510 PR c++/33510
// PR c++/32241
// { dg-do compile }
struct A
{
typedef int T;
T &foo ();
A () { foo.~T (); } // { dg-error "does not have class type|expected" }
};
template <typename T> struct B
{
T &foo ();
B () { foo.~T (); } // { dg-error "invalid use of member" }
};
B<int> b;
template <typename T, typename S> struct C
{
T t;
C () { t.~S (); } // { dg-error "is not of type" }
};
C<int, long int> c;
template <typename T> struct D
{
T t;
typedef long int U;
D () { t.~U (); } // { dg-error "is not of type" }
};
D<int> d;
template <typename T> struct E
{
T &foo ();
typedef long int U;
E () { foo.~U (); } // { dg-error "is not of type" }
};
E<int> e;
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