c++: Revert alias template change [pr95263]

Turns out templates are more complicated than you think, even when you
know they are more complicated than you think.  Reverting this change.

	PR c++/95263
	* pt.c (lookup_template_class_1): Restore alias template mutation.
This commit is contained in:
Nathan Sidwell 2020-05-27 09:50:15 -04:00
parent 6c8e16aea8
commit ac9face8d2
2 changed files with 25 additions and 15 deletions

View File

@ -10062,21 +10062,8 @@ lookup_template_class_1 (tree d1, tree arglist, tree in_decl, tree context,
}
}
/* Build template info for the new specialization. This can
overwrite the existing TEMPLATE_INFO for T (that points to
its instantiated TEMPLATE_DECL), with this one that points to
the most general template, but that's what we want. */
if (TYPE_ALIAS_P (t))
{
/* This should already have been constructed during
instantiation of the alias decl. */
tree ti = DECL_TEMPLATE_INFO (TYPE_NAME (t));
gcc_checking_assert (template_args_equal (TI_ARGS (ti), arglist)
&& TI_TEMPLATE (ti) == found);
}
else
SET_TYPE_TEMPLATE_INFO (t, build_template_info (found, arglist));
// Build template info for the new specialization.
SET_TYPE_TEMPLATE_INFO (t, build_template_info (found, arglist));
elt.spec = t;
slot = type_specializations->find_slot_with_hash (&elt, hash, INSERT);

View File

@ -0,0 +1,23 @@
// { dg-do compile { target c++11 } }
// PR C++/95263
// ICE on alias template instantiation
template <typename> class TPL {
template <int> using INT = int;
};
template <typename T> class Klass
{
public:
template <int I> using ALIAS = typename TPL<T>::INT<I>;
template <int> static void FUNC (); // OK
template <int I, typename> static ALIAS<I> FUNC (); // SFINAE ICE
};
void Fn ()
{
Klass<int>::FUNC<0> ();
}