aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2012-10-01 19:57:18 -0400
committerJason Merrill <jason@gcc.gnu.org>2012-10-01 19:57:18 -0400
commit7a7fc980643bde521579d9ecbce17ae80f8097da (patch)
treefade546f48cfc9f3d33c59f96682e456be1a5368 /gcc
parenta1ffba987b161b6a0b757dcd8e7bca47bc9c27e4 (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/cp/call.c3
-rw-r--r--gcc/cp/cp-tree.h5
-rw-r--r--gcc/cp/decl.c8
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