diff options
author | Jason Merrill <jason@casey.cygnus.com> | 2000-05-01 23:51:37 +0000 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2000-05-01 19:51:37 -0400 |
commit | 5062dbd5ae2d18db9d6e715b38ee2e0a724fcdcc (patch) | |
tree | 9b1f92405a1082371ff58eb6be57788162dc16bc | |
parent | cde28f0da4631eda8559c98fa329febb0f1d17fd (diff) | |
download | gcc-5062dbd5ae2d18db9d6e715b38ee2e0a724fcdcc.zip gcc-5062dbd5ae2d18db9d6e715b38ee2e0a724fcdcc.tar.gz gcc-5062dbd5ae2d18db9d6e715b38ee2e0a724fcdcc.tar.bz2 |
tree.c (build_target_expr_with_type): If we already have a TARGET_EXPR, just return it.
* tree.c (build_target_expr_with_type): If we already have a
TARGET_EXPR, just return it.
* optimize.c (initialize_inlined_parameters): Don't generate an
EXPR_STMT if we can just use DECL_INITIAL.
* decl.c (emit_local_var): Only make the initialization a
full-expression if stmts_are_full_exprs_p.
From-SVN: r33595
-rw-r--r-- | gcc/cp/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/cp/decl.c | 8 | ||||
-rw-r--r-- | gcc/cp/optimize.c | 29 | ||||
-rw-r--r-- | gcc/cp/tree.c | 3 |
4 files changed, 38 insertions, 12 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index efbd8e5..9c9990f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,13 @@ +2000-05-01 Jason Merrill <jason@casey.cygnus.com> + + * tree.c (build_target_expr_with_type): If we already have a + TARGET_EXPR, just return it. + + * optimize.c (initialize_inlined_parameters): Don't generate an + EXPR_STMT if we can just use DECL_INITIAL. + * decl.c (emit_local_var): Only make the initialization a + full-expression if stmts_are_full_exprs_p. + 2000-05-01 Mark Mitchell <mark@codesourcery.com> * cp-tree.h (same_type_ignoring_top_level_qualifiers_p): New diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index d9385f5..3853df1 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -7871,9 +7871,13 @@ emit_local_var (decl) } /* Actually do the initialization. */ - expand_start_target_temps (); + if (stmts_are_full_exprs_p) + expand_start_target_temps (); + expand_decl_init (decl); - expand_end_target_temps (); + + if (stmts_are_full_exprs_p) + expand_end_target_temps (); } /* Finish processing of a declaration; diff --git a/gcc/cp/optimize.c b/gcc/cp/optimize.c index 691969d..1158f39 100644 --- a/gcc/cp/optimize.c +++ b/gcc/cp/optimize.c @@ -429,21 +429,30 @@ initialize_inlined_parameters (id, args, fn) splay_tree_insert (id->decl_map, (splay_tree_key) p, (splay_tree_value) var); + + /* Declare this new variable. */ + init_stmt = build_min_nt (DECL_STMT, var); + TREE_CHAIN (init_stmt) = init_stmts; + init_stmts = init_stmt; + /* Initialize this VAR_DECL from the equivalent argument. If the argument is an object, created via a constructor or copy, this will not result in an extra copy: the TARGET_EXPR representing the argument will be bound to VAR, and the object will be constructed in VAR. */ - init_stmt = build_min_nt (EXPR_STMT, - build (INIT_EXPR, TREE_TYPE (p), - var, value)); - /* Declare this new variable. Note that we do this *after* the - initialization because we are going to reverse all the - initialization statements below. */ - TREE_CHAIN (init_stmt) = build_min_nt (DECL_STMT, var); - /* Add this initialization to the list. */ - TREE_CHAIN (TREE_CHAIN (init_stmt)) = init_stmts; - init_stmts = init_stmt; + if (! TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (p))) + DECL_INITIAL (var) = value; + else + { + init_stmt = build_min_nt (EXPR_STMT, + build (INIT_EXPR, TREE_TYPE (p), + var, value)); + /* Add this initialization to the list. Note that we want the + declaration *after* the initialization because we are going + to reverse all the initialization statements below. */ + TREE_CHAIN (init_stmt) = init_stmts; + init_stmts = init_stmt; + } } /* The initialization statements have been built up in reverse diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index fe175f0..47209b2 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -294,6 +294,9 @@ build_target_expr_with_type (init, type) tree slot; tree rval; + if (TREE_CODE (init) == TARGET_EXPR) + return init; + slot = build (VAR_DECL, type); DECL_ARTIFICIAL (slot) = 1; DECL_CONTEXT (slot) = current_function_decl; |