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:
parent
6c8e16aea8
commit
ac9face8d2
17
gcc/cp/pt.c
17
gcc/cp/pt.c
@ -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);
|
||||
|
23
gcc/testsuite/g++.dg/template/pr95263.C
Normal file
23
gcc/testsuite/g++.dg/template/pr95263.C
Normal 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> ();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user