aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2012-06-25 11:17:59 -0400
committerJason Merrill <jason@gcc.gnu.org>2012-06-25 11:17:59 -0400
commit72de8622ae2d5aaeb58173f454aed87640a989b5 (patch)
tree245bea25403bebfde4c9b5f9652145736aa9e004 /gcc/cp
parent443679ae80afd9cc621d0d6bae5d431a294d0ec2 (diff)
downloadgcc-72de8622ae2d5aaeb58173f454aed87640a989b5.zip
gcc-72de8622ae2d5aaeb58173f454aed87640a989b5.tar.gz
gcc-72de8622ae2d5aaeb58173f454aed87640a989b5.tar.bz2
re PR c++/53202 (Copy constructor not called when starting a thread)
PR c++/53202 * semantics.c (build_data_member_initialization): Always keep initializer for empty base. (cxx_eval_bare_aggregate): Discard it here. From-SVN: r188940
Diffstat (limited to 'gcc/cp')
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/semantics.c13
2 files changed, 13 insertions, 5 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index df3a917..f87b4d6 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,10 @@
2012-06-25 Jason Merrill <jason@redhat.com>
+ PR c++/53202
+ * semantics.c (build_data_member_initialization): Always keep
+ initializer for empty base.
+ (cxx_eval_bare_aggregate): Discard it here.
+
PR c++/53565
* pt.c (tsubst_omp_for_iterator): Simplify DECL_EXPR handling.
(tsubst_expr) [OMP_FOR]: Here, too.
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index ee41861..2d64a66 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -5838,12 +5838,9 @@ build_data_member_initialization (tree t, VEC(constructor_elt,gc) **vec)
member = op;
else
{
- /* We don't put out anything for an empty base. */
+ /* This is an initializer for an empty base; keep it for now so
+ we can check it in cxx_eval_bare_aggregate. */
gcc_assert (is_empty_class (TREE_TYPE (TREE_TYPE (member))));
- /* But if the initializer isn't constexpr, leave it in so we
- complain later. */
- if (potential_constant_expression (init))
- return true;
}
}
if (TREE_CODE (member) == ADDR_EXPR)
@@ -7064,6 +7061,12 @@ cxx_eval_bare_aggregate (const constexpr_call *call, tree t,
constructor_elt *inner = base_field_constructor_elt (n, ce->index);
inner->value = elt;
}
+ else if (TREE_CODE (ce->index) == NOP_EXPR)
+ {
+ /* This is an initializer for an empty base; now that we've
+ checked that it's constant, we can ignore it. */
+ gcc_assert (is_empty_class (TREE_TYPE (TREE_TYPE (ce->index))));
+ }
else
CONSTRUCTOR_APPEND_ELT (n, ce->index, elt);
}