2
0
mirror of git://gcc.gnu.org/git/gcc.git synced 2025-03-26 19:51:12 +08:00

cp-tree.def (PSEUDO_DTOR_EXPR): New tree code.

* cp-tree.def (PSEUDO_DTOR_EXPR): New tree code.
	* decl2.c (build_expr_from_tree): Handle it.
	* error.c (dump_expr): Likewise.
	* pt.c (for_each_template_parm): Likewise.
	(tsubst_copy): Likewise.
	* tree.c (search_tree): Likewise.
	* semantics.c (finish_pseudo_destructor_call): Create it.

From-SVN: r28760
This commit is contained in:
Mark Mitchell 1999-08-19 08:06:17 +00:00 committed by Mark Mitchell
parent 4c44366adb
commit 40242ccfbd
8 changed files with 39 additions and 0 deletions

@ -1,3 +1,13 @@
1999-08-19 Mark Mitchell <mark@codesourcery.com>
* cp-tree.def (PSEUDO_DTOR_EXPR): New tree code.
* decl2.c (build_expr_from_tree): Handle it.
* error.c (dump_expr): Likewise.
* pt.c (for_each_template_parm): Likewise.
(tsubst_copy): Likewise.
* tree.c (search_tree): Likewise.
* semantics.c (finish_pseudo_destructor_call): Create it.
1999-08-18 Mark Mitchell <mark@codesourcery.com>
* search.c (setup_class_bindings): Robustify.

@ -214,6 +214,7 @@ DEFTREECODE (ALIGNOF_EXPR, "alignof_expr", '1', 1)
DEFTREECODE (ARROW_EXPR, "arrow_expr", 'e', 1)
DEFTREECODE (DOTSTAR_EXPR, "dotstar_expr", 'e', 2)
DEFTREECODE (TYPEID_EXPR, "typeid_expr", 'e', 1)
DEFTREECODE (PSEUDO_DTOR_EXPR, "pseudo_dtor_expr", 'e', 3)
DEFTREECODE (EXPR_STMT, "expr_stmt", 'e', 1)
DEFTREECODE (COMPOUND_STMT, "compound_stmt", 'e', 1)

@ -3992,6 +3992,12 @@ build_expr_from_tree (t)
build_expr_from_tree (TREE_OPERAND (t, 1)),
build_expr_from_tree (TREE_OPERAND (t, 2)));
case PSEUDO_DTOR_EXPR:
return (finish_pseudo_destructor_call_expr
(build_expr_from_tree (TREE_OPERAND (t, 0)),
build_expr_from_tree (TREE_OPERAND (t, 1)),
build_expr_from_tree (TREE_OPERAND (t, 2))));
case TREE_LIST:
{
tree purpose, value, chain;

@ -1776,6 +1776,14 @@ dump_expr (t, nop)
dump_expr (TREE_OPERAND (t, 0), nop);
break;
case PSEUDO_DTOR_EXPR:
dump_expr (TREE_OPERAND (t, 2), nop);
OB_PUTS (".");
dump_type (TREE_OPERAND (t, 0), nop);
OB_PUTS ("::~");
dump_type (TREE_OPERAND (t, 1), nop);
break;
case TEMPLATE_ID_EXPR:
dump_decl (t, 0);
break;

@ -4300,6 +4300,7 @@ for_each_template_parm (t, fn, data)
case DOTSTAR_EXPR:
case TYPEID_EXPR:
case LOOKUP_EXPR:
case PSEUDO_DTOR_EXPR:
if (!fn)
return 1;
/* Fall through. */
@ -7078,6 +7079,7 @@ tsubst_copy (t, args, complain, in_decl)
case COND_EXPR:
case MODOP_EXPR:
case PSEUDO_DTOR_EXPR:
{
r = build_nt
(code, tsubst_copy (TREE_OPERAND (t, 0), args, complain, in_decl),

@ -1229,6 +1229,9 @@ finish_pseudo_destructor_call_expr (object, scope, destructor)
tree scope;
tree destructor;
{
if (processing_template_decl)
return build_min_nt (PSEUDO_DTOR_EXPR, object, scope, destructor);
if (scope && scope != destructor)
cp_error ("destructor specifier `%T::~%T()' must have matching names",
scope, destructor);

@ -1675,6 +1675,7 @@ search_tree (t, func)
case ARROW_EXPR:
case DOTSTAR_EXPR:
case TYPEID_EXPR:
case PSEUDO_DTOR_EXPR:
break;
case COMPLEX_CST:

@ -0,0 +1,8 @@
// Build don't link:
// Origin: Jean-Francois Panisset <panisset@discreet.com>
template<class T>
void foo(T *data)
{
((char *)data)->~T();
}