diff options
author | Jason Merrill <jason@redhat.com> | 2012-10-01 19:57:18 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2012-10-01 19:57:18 -0400 |
commit | 7a7fc980643bde521579d9ecbce17ae80f8097da (patch) | |
tree | fade546f48cfc9f3d33c59f96682e456be1a5368 /gcc | |
parent | a1ffba987b161b6a0b757dcd8e7bca47bc9c27e4 (diff) | |
download | gcc-7a7fc980643bde521579d9ecbce17ae80f8097da.zip gcc-7a7fc980643bde521579d9ecbce17ae80f8097da.tar.gz gcc-7a7fc980643bde521579d9ecbce17ae80f8097da.tar.bz2 |
decl.c (check_initializer): Set DECL_NONTRIVIALLY_INITIALIZED_P for a constructor call.
* decl.c (check_initializer): Set DECL_NONTRIVIALLY_INITIALIZED_P
for a constructor call.
(decl_jump_unsafe): So don't bother checking
type_has_nontrivial_default_init.
* call.c (set_up_extended_ref_temp): Set
DECL_NONTRIVIALLY_INITIALIZED_P.
From-SVN: r191948
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/call.c | 3 | ||||
-rw-r--r-- | gcc/cp/cp-tree.h | 5 | ||||
-rw-r--r-- | gcc/cp/decl.c | 8 |
4 files changed, 19 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 487841a..f868739 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,12 @@ 2012-10-01 Jason Merrill <jason@redhat.com> + * decl.c (check_initializer): Set DECL_NONTRIVIALLY_INITIALIZED_P + for a constructor call. + (decl_jump_unsafe): So don't bother checking + type_has_nontrivial_default_init. + * call.c (set_up_extended_ref_temp): Set + DECL_NONTRIVIALLY_INITIALIZED_P. + * cp-tree.h (TYPE_FUNCTION_OR_TEMPLATE_DECL_CHECK): New. (DECL_FRIEND_P, DECL_ANTICIPATED): Use it. (TYPE_FUNCTION_OR_TEMPLATE_DECL_P): New. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 6f7e346..d0492d8 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -8792,6 +8792,9 @@ set_up_extended_ref_temp (tree decl, tree expr, VEC(tree,gc) **cleanups, TARGET_EXPR_INITIAL (expr) = extend_ref_init_temps (decl, TARGET_EXPR_INITIAL (expr), cleanups); + /* Any reference temp has a non-trivial initializer. */ + DECL_NONTRIVIALLY_INITIALIZED_P (var) = true; + /* If the initializer is constant, put it in DECL_INITIAL so we get static initialization and use in constant expressions. */ init = maybe_constant_init (expr); diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index e4f3761..bfe7ad7 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -2271,12 +2271,13 @@ struct GTY((variable_size)) lang_decl { /* Nonzero for a VAR_DECL means that the variable's initialization (if any) has been processed. (In general, DECL_INITIALIZED_P is - !DECL_EXTERN, but static data members may be initialized even if + !DECL_EXTERNAL, but static data members may be initialized even if not defined.) */ #define DECL_INITIALIZED_P(NODE) \ (TREE_LANG_FLAG_1 (VAR_DECL_CHECK (NODE))) -/* Nonzero for a VAR_DECL iff an explicit initializer was provided. */ +/* Nonzero for a VAR_DECL iff an explicit initializer was provided + or a non-trivial constructor is called. */ #define DECL_NONTRIVIALLY_INITIALIZED_P(NODE) \ (TREE_LANG_FLAG_3 (VAR_DECL_CHECK (NODE))) diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index d4c78e1..d0933ef 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -2679,8 +2679,7 @@ decl_jump_unsafe (tree decl) type = strip_array_types (type); - if (type_has_nontrivial_default_init (TREE_TYPE (decl)) - || DECL_NONTRIVIALLY_INITIALIZED_P (decl)) + if (DECL_NONTRIVIALLY_INITIALIZED_P (decl)) return 2; if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (decl))) @@ -5581,6 +5580,11 @@ check_initializer (tree decl, tree init, int flags, VEC(tree,gc) **cleanups) { init_code = build_aggr_init_full_exprs (decl, init, flags); + /* A constructor call is a non-trivial initializer even if + it isn't explicitly written. */ + if (TREE_SIDE_EFFECTS (init_code)) + DECL_NONTRIVIALLY_INITIALIZED_P (decl) = true; + /* If this is a constexpr initializer, expand_default_init will have returned an INIT_EXPR rather than a CALL_EXPR. In that case, pull the initializer back out and pass it down into |