PR c++/86171 - ICE with recursive alias instantiation.

* pt.c (tsubst_decl): Handle recursive alias instantiation.

From-SVN: r261709
This commit is contained in:
Jason Merrill 2018-06-18 14:16:38 -04:00 committed by Jason Merrill
parent 8499a82c19
commit 5d4d0be813
3 changed files with 24 additions and 1 deletions

View file

@ -1,3 +1,8 @@
2018-06-18 Jason Merrill <jason@redhat.com>
PR c++/86171 - ICE with recursive alias instantiation.
* pt.c (tsubst_decl): Handle recursive alias instantiation.
2018-06-18 Paolo Carlini <paolo.carlini@oracle.com>
* decl.c (duplicate_decls): Consistently use DECL_SOURCE_LOCATION

View file

@ -13639,7 +13639,6 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
}
/* Create a new node for the specialization we need. */
r = copy_decl (t);
if (type == NULL_TREE)
{
if (is_typedef_decl (t))
@ -13664,7 +13663,16 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
sub_args = strip_innermost_template_args (args, extra);
}
type = tsubst (type, sub_args, complain, in_decl);
/* Substituting the type might have recursively instantiated this
same alias (c++/86171). */
if (gen_tmpl && DECL_ALIAS_TEMPLATE_P (gen_tmpl)
&& (spec = retrieve_specialization (gen_tmpl, argvec, hash)))
{
r = spec;
break;
}
}
r = copy_decl (t);
if (VAR_P (r))
{
DECL_INITIALIZED_P (r) = 0;

View file

@ -0,0 +1,10 @@
// PR c++/86171
// { dg-do compile { target c++11 } }
template <class> struct A;
template <class T> using B = typename A<T>::X;
template <class T> struct A {
typedef int X;
typedef B<T> U;
};
B<short> b;