From: Jason Merrill Date: Thu, 4 Nov 2010 02:15:08 +0000 (-0400) Subject: re PR c++/46293 (constexpr vs. tuple, ice) X-Git-Tag: releases/gcc-4.6.0~2938 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=dafed7ca0bdb906406efdd84256e1cebde06b94e;p=thirdparty%2Fgcc.git re PR c++/46293 (constexpr vs. tuple, ice) PR c++/46293 * semantics.c (build_data_member_initialization): Handle value-init of aggregate empty base. From-SVN: r166297 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e384cf7991e7..c432ca8150c9 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2010-11-03 Jason Merrill + PR c++/46293 + * semantics.c (build_data_member_initialization): Handle + value-init of aggregate empty base. + PR c++/46289 * call.c (can_convert_array): New fn. (build_aggr_conv): Use it. diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 562fab14d6b5..9061a89ed245 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -5460,6 +5460,14 @@ build_data_member_initialization (tree t, VEC(constructor_elt,gc) **vec) { member = TREE_OPERAND (t, 0); init = unshare_expr (TREE_OPERAND (t, 1)); + if (TREE_CODE (member) == INDIRECT_REF) + { + /* Don't put out anything for value-init of an empty base. */ + gcc_assert (is_empty_class (TREE_TYPE (member))); + gcc_assert (TREE_CODE (init) == CONSTRUCTOR + && CONSTRUCTOR_NELTS (init) == 0); + return true; + } } else { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0597d4718dc4..cc638523b974 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2010-11-03 Jason Merrill + PR c++/46293 + * g++.dg/cpp0x/constexpr-base2.C: New. + PR c++/46289 * g++.dg/cpp0x/initlist45.C: New. diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-base2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-base2.C new file mode 100644 index 000000000000..3ea75432a226 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-base2.C @@ -0,0 +1,19 @@ +// PR c++/46293 +// { dg-options -std=c++0x } + +struct A +{ +}; + +struct C +{ + int i; + constexpr C(int i): i(i) {} +}; + +struct B: A, C +{ + constexpr B(): A(), C(42) { } +}; + +constexpr B b{};