* 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
+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.
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)
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;
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;
case DOTSTAR_EXPR:
case TYPEID_EXPR:
case LOOKUP_EXPR:
+ case PSEUDO_DTOR_EXPR:
if (!fn)
return 1;
/* Fall through. */
case COND_EXPR:
case MODOP_EXPR:
+ case PSEUDO_DTOR_EXPR:
{
r = build_nt
(code, tsubst_copy (TREE_OPERAND (t, 0), args, complain, in_decl),
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);
case ARROW_EXPR:
case DOTSTAR_EXPR:
case TYPEID_EXPR:
+ case PSEUDO_DTOR_EXPR:
break;
case COMPLEX_CST:
--- /dev/null
+// Build don't link:
+// Origin: Jean-Francois Panisset <panisset@discreet.com>
+
+template<class T>
+void foo(T *data)
+{
+ ((char *)data)->~T();
+}