From dafed7ca0bdb906406efdd84256e1cebde06b94e Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 3 Nov 2010 22:15:08 -0400 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 4 ++++ gcc/cp/semantics.c | 8 ++++++++ gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/g++.dg/cpp0x/constexpr-base2.C | 19 +++++++++++++++++++ 4 files changed, 34 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp0x/constexpr-base2.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e384cf7991e..c432ca8150c 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 562fab14d6b..9061a89ed24 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 0597d4718dc..cc638523b97 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 00000000000..3ea75432a22 --- /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{};