PR c++/70468 - ICE with constructor delegation via typedef.

* pt.c (tsubst_initializer_list): Check for other mem-initializers
	with constructor delegation.

From-SVN: r257931
This commit is contained in:
Jason Merrill 2018-02-23 08:32:41 -05:00 committed by Jason Merrill
parent c287dea0c4
commit 54fbd24d8e
3 changed files with 59 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2018-02-22 Jason Merrill <jason@redhat.com>
PR c++/70468 - ICE with constructor delegation via typedef.
* pt.c (tsubst_initializer_list): Check for other mem-initializers
with constructor delegation.
2018-02-22 Jason Merrill <jason@redhat.com> 2018-02-22 Jason Merrill <jason@redhat.com>
PR c++/84424 - ICE with constexpr and __builtin_shuffle. PR c++/84424 - ICE with constexpr and __builtin_shuffle.

View File

@ -23558,6 +23558,7 @@ static tree
tsubst_initializer_list (tree t, tree argvec) tsubst_initializer_list (tree t, tree argvec)
{ {
tree inits = NULL_TREE; tree inits = NULL_TREE;
tree target_ctor = error_mark_node;
for (; t; t = TREE_CHAIN (t)) for (; t; t = TREE_CHAIN (t))
{ {
@ -23674,6 +23675,28 @@ tsubst_initializer_list (tree t, tree argvec)
in_base_initializer = 0; in_base_initializer = 0;
} }
if (target_ctor != error_mark_node
&& init != error_mark_node)
{
error ("mem-initializer for %qD follows constructor delegation",
decl);
return inits;
}
/* Look for a target constructor. */
if (init != error_mark_node
&& decl && CLASS_TYPE_P (decl)
&& same_type_p (decl, current_class_type))
{
maybe_warn_cpp0x (CPP0X_DELEGATING_CTORS);
if (inits)
{
error ("constructor delegation follows mem-initializer for %qD",
TREE_PURPOSE (inits));
continue;
}
target_ctor = init;
}
if (decl) if (decl)
{ {
init = build_tree_list (decl, init); init = build_tree_list (decl, init);

View File

@ -0,0 +1,30 @@
// PR c++/70468
// { dg-do compile { target c++11 } }
// { dg-additional-options -w }
struct S {};
template < typename = S >
class A
{
public:
A () : f0 (), f1 () {} // { dg-error "" }
private:
typedef A<> f0;
int f1;
};
template < typename = S, typename = S >
class B
{
};
template < typename T1, typename T2 >
B < T1, T2 > &operator<< (B < T1, T2 >&, const int)
{
A<> ();
}
template
B < S, S > &operator<< (B < S, S >&, const int);