diff options
-rw-r--r-- | gcc/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/c-common.c | 1 | ||||
-rw-r--r-- | gcc/c-common.def | 5 | ||||
-rw-r--r-- | gcc/c-common.h | 7 | ||||
-rw-r--r-- | gcc/c-semantics.c | 4 | ||||
-rw-r--r-- | gcc/cp/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/cp/cp-tree.def | 4 | ||||
-rw-r--r-- | gcc/cp/cp-tree.h | 2 | ||||
-rw-r--r-- | gcc/cp/decl.c | 5 | ||||
-rw-r--r-- | gcc/cp/dump.c | 9 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 4 | ||||
-rw-r--r-- | gcc/cp/tree.c | 1 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/opt/dtor1.C | 27 | ||||
-rw-r--r-- | gcc/tree-dump.c | 7 | ||||
-rw-r--r-- | gcc/tree-inline.c | 19 |
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; |