Commit 2b00e201 by Jason Merrill Committed by Jason Merrill

re PR c++/46348 ([C++0x] ICE with constexpr default constructor and array member)

	PR c++/46348
	* semantics.c (cxx_eval_vec_init_1): Handle value-init.
	(cxx_eval_vec_init): Pass value_init arg.

From-SVN: r167623
parent a5fc85d1
2010-12-08 Jason Merrill <jason@redhat.com>
PR c++/46348
* semantics.c (cxx_eval_vec_init_1): Handle value-init.
(cxx_eval_vec_init): Pass value_init arg.
2010-12-08 Nathan Froyd <froydnj@codesourcery.com> 2010-12-08 Nathan Froyd <froydnj@codesourcery.com>
PR c++/45329 PR c++/45329
......
...@@ -6391,15 +6391,16 @@ cxx_eval_bare_aggregate (const constexpr_call *call, tree t, ...@@ -6391,15 +6391,16 @@ cxx_eval_bare_aggregate (const constexpr_call *call, tree t,
initialization of a non-static data member of array type. Reduce it to a initialization of a non-static data member of array type. Reduce it to a
CONSTRUCTOR. CONSTRUCTOR.
Note that this is only intended to support the initializations done by Note that apart from value-initialization (when VALUE_INIT is true),
defaulted constructors for classes with non-static data members of array this is only intended to support value-initialization and the
type. In this case, VEC_INIT_EXPR_INIT will either be NULL_TREE for the initializations done by defaulted constructors for classes with
default constructor, or a COMPONENT_REF for the copy/move non-static data members of array type. In this case, VEC_INIT_EXPR_INIT
constructor. */ will either be NULL_TREE for the default constructor, or a COMPONENT_REF
for the copy/move constructor. */
static tree static tree
cxx_eval_vec_init_1 (const constexpr_call *call, tree atype, tree init, cxx_eval_vec_init_1 (const constexpr_call *call, tree atype, tree init,
bool allow_non_constant, bool addr, bool value_init, bool allow_non_constant, bool addr,
bool *non_constant_p) bool *non_constant_p)
{ {
tree elttype = TREE_TYPE (atype); tree elttype = TREE_TYPE (atype);
...@@ -6412,7 +6413,9 @@ cxx_eval_vec_init_1 (const constexpr_call *call, tree atype, tree init, ...@@ -6412,7 +6413,9 @@ cxx_eval_vec_init_1 (const constexpr_call *call, tree atype, tree init,
here, as for a constructor to be constexpr, all members must be here, as for a constructor to be constexpr, all members must be
initialized, which for a defaulted default constructor means they must initialized, which for a defaulted default constructor means they must
be of a class type with a constexpr default constructor. */ be of a class type with a constexpr default constructor. */
if (!init) if (value_init)
gcc_assert (!init);
else if (!init)
{ {
VEC(tree,gc) *argvec = make_tree_vector (); VEC(tree,gc) *argvec = make_tree_vector ();
init = build_special_member_call (NULL_TREE, complete_ctor_identifier, init = build_special_member_call (NULL_TREE, complete_ctor_identifier,
...@@ -6433,12 +6436,21 @@ cxx_eval_vec_init_1 (const constexpr_call *call, tree atype, tree init, ...@@ -6433,12 +6436,21 @@ cxx_eval_vec_init_1 (const constexpr_call *call, tree atype, tree init,
if (TREE_CODE (elttype) == ARRAY_TYPE) if (TREE_CODE (elttype) == ARRAY_TYPE)
{ {
/* A multidimensional array; recurse. */ /* A multidimensional array; recurse. */
eltinit = cp_build_array_ref (input_location, init, idx, if (value_init)
tf_warning_or_error); eltinit = NULL_TREE;
eltinit = cxx_eval_vec_init_1 (call, elttype, eltinit, else
eltinit = cp_build_array_ref (input_location, init, idx,
tf_warning_or_error);
eltinit = cxx_eval_vec_init_1 (call, elttype, eltinit, value_init,
allow_non_constant, addr, allow_non_constant, addr,
non_constant_p); non_constant_p);
} }
else if (value_init)
{
eltinit = build_value_init (elttype, tf_warning_or_error);
eltinit = cxx_eval_constant_expression
(call, eltinit, allow_non_constant, addr, non_constant_p);
}
else if (TREE_CODE (init) == CONSTRUCTOR) else if (TREE_CODE (init) == CONSTRUCTOR)
{ {
/* Initializing an element using the call to the default /* Initializing an element using the call to the default
...@@ -6488,8 +6500,9 @@ cxx_eval_vec_init (const constexpr_call *call, tree t, ...@@ -6488,8 +6500,9 @@ cxx_eval_vec_init (const constexpr_call *call, tree t,
{ {
tree atype = TREE_TYPE (t); tree atype = TREE_TYPE (t);
tree init = VEC_INIT_EXPR_INIT (t); tree init = VEC_INIT_EXPR_INIT (t);
tree r = cxx_eval_vec_init_1 (call, atype, init, allow_non_constant, tree r = cxx_eval_vec_init_1 (call, atype, init,
addr, non_constant_p); VEC_INIT_EXPR_VALUE_INIT (t),
allow_non_constant, addr, non_constant_p);
if (*non_constant_p) if (*non_constant_p)
return t; return t;
else else
......
2010-12-08 Jason Merrill <jason@redhat.com>
PR c++/46348
* g++.dg/cpp0x/constexpr-array2.C: New.
2010-12-08 H.J. Lu <hongjiu.lu@intel.com> 2010-12-08 H.J. Lu <hongjiu.lu@intel.com>
* gcc.target/i386/sse2-init-v2di-2.c: Add "-dp" and update * gcc.target/i386/sse2-init-v2di-2.c: Add "-dp" and update
......
// PR c++/46348
// { dg-options -std=c++0x }
template<__SIZE_TYPE__ _Nw>
struct _Base
{
typedef unsigned long _WordT;
_WordT _M_w[_Nw];
constexpr
_Base()
: _M_w() { }
};
int main()
{
_Base<256> bs;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment