Commit 9fa6ffe1 by Jason Merrill Committed by Jason Merrill

re PR c++/66515 (g++ segfaults when creating an std::initializer_list)

	PR c++/66515
	* call.c (implicit_conversion): Call reshape_init here, early.
	(build_aggr_conv): Not here.

From-SVN: r224581
parent cc7f3d0e
2015-06-17 Jason Merrill <jason@redhat.com>
PR c++/66515
* call.c (implicit_conversion): Call reshape_init here, early.
(build_aggr_conv): Not here.
2015-06-17 Jakub Jelinek <jakub@redhat.com>
PR c++/66571
......
......@@ -868,9 +868,7 @@ build_aggr_conv (tree type, tree ctor, int flags, tsubst_flags_t complain)
tree field = next_initializable_field (TYPE_FIELDS (type));
tree empty_ctor = NULL_TREE;
ctor = reshape_init (type, ctor, tf_none);
if (ctor == error_mark_node)
return NULL;
/* We already called reshape_init in implicit_conversion. */
/* The conversions within the init-list aren't affected by the enclosing
context; they're always simple copy-initialization. */
......@@ -1759,6 +1757,17 @@ implicit_conversion (tree to, tree from, tree expr, bool c_cast_p,
to that conversion. */
complain &= ~tf_error;
/* Call reshape_init early to remove redundant braces. */
if (expr && BRACE_ENCLOSED_INITIALIZER_P (expr)
&& COMPLETE_TYPE_P (complete_type (to))
&& CP_AGGREGATE_TYPE_P (to))
{
expr = reshape_init (to, expr, complain);
if (expr == error_mark_node)
return NULL;
from = TREE_TYPE (expr);
}
if (TREE_CODE (to) == REFERENCE_TYPE)
conv = reference_binding (to, from, expr, c_cast_p, flags, complain);
else
......
// PR c++/66515
// { dg-do compile { target c++11 } }
namespace std
{
template <class _E> class initializer_list
{
const _E *_M_array;
unsigned long _M_len;
};
}
struct type_t { };
type_t &
get ()
{
std::initializer_list<type_t>{ { get () } };
}
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