summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog12
-rw-r--r--gcc/c-common.c1
-rw-r--r--gcc/c-common.def5
-rw-r--r--gcc/c-common.h7
-rw-r--r--gcc/c-semantics.c4
-rw-r--r--gcc/cp/ChangeLog10
-rw-r--r--gcc/cp/cp-tree.def4
-rw-r--r--gcc/cp/cp-tree.h2
-rw-r--r--gcc/cp/decl.c5
-rw-r--r--gcc/cp/dump.c9
-rw-r--r--gcc/cp/semantics.c4
-rw-r--r--gcc/cp/tree.c1
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/opt/dtor1.C27
-rw-r--r--gcc/tree-dump.c7
-rw-r--r--gcc/tree-inline.c19
16 files changed, 95 insertions, 26 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b6e1d87aa40..2f3e025caf7 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,15 @@
+2002-03-15 Mark Mitchell <mark@codesourcery.com>
+
+ * c-common.c (statement_code_p): Handle CLEANUP_STMT.
+ * c-common.def (CLEANUP_STMT): New tree node.
+ * c-common.h (CLEANUP_DECL): New macro.
+ (CLEANUP_EXPR): Likewise.
+ * c-semantics.c (expand_stmt): Handle CLEANUP_STMT.
+ * expr.c (expand_expr): Tidy.
+ * tree-dump.c (dequeue_and_dump): Handle CLEANUP_STMT.
+ * tree-inline.c (initialize_inlined_parameters): Clean up
+ new local variables.
+
2002-03-15 Jakub Jelinek <jakub@redhat.com>
PR bootstrap/4128
diff --git a/gcc/c-common.c b/gcc/c-common.c
index 0352eb6bbc9..4b2350e8cc4 100644
--- a/gcc/c-common.c
+++ b/gcc/c-common.c
@@ -3213,6 +3213,7 @@ statement_code_p (code)
{
switch (code)
{
+ case CLEANUP_STMT:
case EXPR_STMT:
case COMPOUND_STMT:
case DECL_STMT:
diff --git a/gcc/c-common.def b/gcc/c-common.def
index 293f4b21bd3..7ad9e385229 100644
--- a/gcc/c-common.def
+++ b/gcc/c-common.def
@@ -113,6 +113,11 @@ DEFTREECODE (STMT_EXPR, "stmt_expr", 'e', 1)
the compound literal. */
DEFTREECODE (COMPOUND_LITERAL_EXPR, "compound_literal_expr", 'e', 1)
+/* A CLEANUP_STMT marks the point at which a declaration is fully
+ constructed. If, after this point, the CLEANUP_DECL goes out of
+ scope, the CLEANUP_EXPR must be run. */
+DEFTREECODE (CLEANUP_STMT, "cleanup_stmt", 'e', 2)
+
/*
Local variables:
mode:c
diff --git a/gcc/c-common.h b/gcc/c-common.h
index 314a6ba3a15..280c5b0d2d2 100644
--- a/gcc/c-common.h
+++ b/gcc/c-common.h
@@ -693,6 +693,13 @@ extern tree strip_array_types PARAMS ((tree));
#define ASM_VOLATILE_P(NODE) \
(ASM_CV_QUAL (ASM_STMT_CHECK (NODE)) != NULL_TREE)
+/* The VAR_DECL to clean up in a CLEANUP_STMT. */
+#define CLEANUP_DECL(NODE) \
+ TREE_OPERAND (CLEANUP_STMT_CHECK (NODE), 0)
+/* The cleanup to run in a CLEANUP_STMT. */
+#define CLEANUP_EXPR(NODE) \
+ TREE_OPERAND (CLEANUP_STMT_CHECK (NODE), 1)
+
/* The filename we are changing to as of this FILE_STMT. */
#define FILE_STMT_FILENAME_NODE(NODE) \
(TREE_OPERAND (FILE_STMT_CHECK (NODE), 0))
diff --git a/gcc/c-semantics.c b/gcc/c-semantics.c
index 8f99bc1f64c..3d8759d8584 100644
--- a/gcc/c-semantics.c
+++ b/gcc/c-semantics.c
@@ -847,6 +847,10 @@ expand_stmt (t)
genrtl_scope_stmt (t);
break;
+ case CLEANUP_STMT:
+ genrtl_decl_cleanup (CLEANUP_DECL (t), CLEANUP_EXPR (t));
+ break;
+
default:
if (lang_expand_stmt)
(*lang_expand_stmt) (t);
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 111edcc283a..90ac3c60d8e 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,13 @@
+2002-03-15 Mark Mitchell <mark@codesourcery.com>
+
+ * cp-tree.h (CLEANUP_DECL): Remove.
+ (CLEANUP_EXPR): Likewise.
+ * decl.c (destroy_local_var): Simplify.
+ (maybe_build_cleanup): Tidy.
+ * dump.c (cp_dump_tree): Remove handling of CLEANUP_STMT.
+ * semantics.c (cp_expand_stmt): Likewise.
+ * cp/tree.c (cp_statement_code_p): Likewise.
+
2002-03-15 Jason Merrill <jason@redhat.com>
PR c++/5857
diff --git a/gcc/cp/cp-tree.def b/gcc/cp/cp-tree.def
index dbe990a2e11..38545256114 100644
--- a/gcc/cp/cp-tree.def
+++ b/gcc/cp/cp-tree.def
@@ -230,10 +230,6 @@ DEFTREECODE (SUBOBJECT, "subobject", 'e', 1)
the cleanups associated with any SUBOBJECT_CLEANUPS need no longer
be run. */
DEFTREECODE (CTOR_STMT, "ctor_stmt", 'e', 0)
-/* A CLEANUP_STMT marks the point at which a declaration is fully
- constructed. If, after this point, the CLEANUP_DECL goes out of
- scope, the CLEANUP_EXPR must be run. */
-DEFTREECODE (CLEANUP_STMT, "cleanup_stmt", 'e', 2)
/* CTOR_INITIALIZER is a placeholder in template code for a call to
setup_vtbl_pointer (and appears in all functions, not just ctors). */
DEFTREECODE (CTOR_INITIALIZER, "ctor_initializer", 'e', 2)
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 5f58ef66ca5..68a141c5b56 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -322,8 +322,6 @@ typedef struct ptrmem_cst
set_namespace_binding ((NODE), current_namespace, (VAL))
#define CLEANUP_P(NODE) TREE_LANG_FLAG_0 (TRY_BLOCK_CHECK (NODE))
-#define CLEANUP_DECL(NODE) TREE_OPERAND (CLEANUP_STMT_CHECK (NODE), 0)
-#define CLEANUP_EXPR(NODE) TREE_OPERAND (CLEANUP_STMT_CHECK (NODE), 1)
/* Returns nonzero iff TYPE1 and TYPE2 are the same type, in the usual
sense of `same'. */
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index d76c6a5c490..30351c90d44 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -8035,8 +8035,7 @@ destroy_local_var (decl)
cleanup = maybe_build_cleanup (decl);
/* Record the cleanup required for this declaration. */
- if (DECL_SIZE (decl) && TREE_TYPE (decl) != error_mark_node
- && cleanup)
+ if (DECL_SIZE (decl) && cleanup)
finish_decl_cleanup (decl, cleanup);
}
@@ -14512,7 +14511,7 @@ maybe_build_cleanup (decl)
return rval;
}
- return 0;
+ return NULL_TREE;
}
/* When a stmt has been parsed, this function is called. */
diff --git a/gcc/cp/dump.c b/gcc/cp/dump.c
index 98c1fc49d87..6dd60baf73b 100644
--- a/gcc/cp/dump.c
+++ b/gcc/cp/dump.c
@@ -1,5 +1,5 @@
/* Tree-dumping functionality for intermediate representation.
- Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
Written by Mark Mitchell <mark@codesourcery.com>
This file is part of GNU CC.
@@ -390,13 +390,6 @@ cp_dump_tree (dump_info, t)
dump_child ("decl", TREE_OPERAND (t, 2));
break;
- case CLEANUP_STMT:
- dump_stmt (di, t);
- dump_child ("decl", CLEANUP_DECL (t));
- dump_child ("expr", CLEANUP_EXPR (t));
- dump_next_stmt (di, t);
- break;
-
case CTOR_STMT:
dump_stmt (di, t);
if (CTOR_BEGIN_P (t))
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index 3ec15a9bb91..14ecf05f9b5 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -2125,10 +2125,6 @@ cp_expand_stmt (t)
{
switch (TREE_CODE (t))
{
- case CLEANUP_STMT:
- genrtl_decl_cleanup (CLEANUP_DECL (t), CLEANUP_EXPR (t));
- break;
-
case CTOR_STMT:
genrtl_ctor_stmt (t);
break;
diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c
index 5a8b902455b..acd6fbf3f1d 100644
--- a/gcc/cp/tree.c
+++ b/gcc/cp/tree.c
@@ -1031,7 +1031,6 @@ cp_statement_code_p (code)
switch (code)
{
case SUBOBJECT:
- case CLEANUP_STMT:
case CTOR_STMT:
case CTOR_INITIALIZER:
case RETURN_INIT:
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index b60f1145901..531289ff99e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2002-03-15 Mark Mitchell <mark@codesourcery.com>
+
+ * g++.dg/opt/dtor1.C: New test.
+
2002-03-15 Jakub Jelinek <jakub@redhat.com>
* gcc.c-torture/compile/20020315-1.c: New test.
diff --git a/gcc/testsuite/g++.dg/opt/dtor1.C b/gcc/testsuite/g++.dg/opt/dtor1.C
new file mode 100644
index 00000000000..0352676c5f7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/dtor1.C
@@ -0,0 +1,27 @@
+// { dg-do run }
+// { dg-options "-O2" }
+
+int i;
+
+struct S {
+ S ();
+ S (const S&);
+ ~S ();
+};
+
+S::S () { ++i; }
+S::S (const S&) { ++i; }
+S::~S () { --i; }
+
+inline void f (S) {
+}
+
+int main () {
+ {
+ S s;
+ f (s);
+ }
+
+ return i;
+}
+
diff --git a/gcc/tree-dump.c b/gcc/tree-dump.c
index 9eac6e075f1..d8d8e23ea5f 100644
--- a/gcc/tree-dump.c
+++ b/gcc/tree-dump.c
@@ -548,6 +548,13 @@ dequeue_and_dump (di)
dump_next_stmt (di, t);
break;
+ case CLEANUP_STMT:
+ dump_stmt (di, t);
+ dump_child ("decl", CLEANUP_DECL (t));
+ dump_child ("expr", CLEANUP_EXPR (t));
+ dump_next_stmt (di, t);
+ break;
+
case COMPOUND_STMT:
dump_stmt (di, t);
dump_child ("body", COMPOUND_BODY (t));
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
index f8ca55c780f..ce548849d2d 100644
--- a/gcc/tree-inline.c
+++ b/gcc/tree-inline.c
@@ -480,6 +480,7 @@ initialize_inlined_parameters (id, args, fn)
tree init_stmt;
tree var;
tree value;
+ tree cleanup;
/* Find the initializer. */
value = a ? TREE_VALUE (a) : NULL_TREE;
@@ -558,16 +559,26 @@ initialize_inlined_parameters (id, args, fn)
TREE_CHAIN (init_stmt) = init_stmts;
init_stmts = init_stmt;
}
+
+ /* See if we need to clean up the declaration. */
+ cleanup = maybe_build_cleanup (var);
+ if (cleanup)
+ {
+ tree cleanup_stmt;
+ /* Build the cleanup statement. */
+ cleanup_stmt = build_stmt (CLEANUP_STMT, var, cleanup);
+ /* Add it to the *front* of the list; the list will be
+ reversed below. */
+ TREE_CHAIN (cleanup_stmt) = init_stmts;
+ init_stmts = cleanup_stmt;
+ }
}
/* Evaluate trailing arguments. */
for (; a; a = TREE_CHAIN (a))
{
tree init_stmt;
- tree value;
-
- /* Find the initializer. */
- value = a ? TREE_VALUE (a) : NULL_TREE;
+ tree value = TREE_VALUE (a);
if (! value || ! TREE_SIDE_EFFECTS (value))
continue;