From 74744bb1f2847b5b9ce3e97e0fec9c23bb0e499f Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Tue, 19 May 2020 13:29:19 -0700 Subject: [PATCH] c++: Alias template instantiation template info I discovered that the alias instantiation machinery would setup template_info, and then sometime later overwrite that with equivalent info. This broke modules, because the template info, once set, is logically immutable. Let's just not do that. * pt.c (lookup_template_class_1): Do not reinit template_info of an alias here. --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/pt.c | 17 +++++++++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 87d1ce76bc8..a81a6200ff5 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2020-05-19 Nathan Sidwell + + * pt.c (lookup_template_class_1): Do not reinit template_info of an + alias here. + 2020-05-18 Martin Sebor PR c++/94923 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 4d9651acee6..c17a038c6d0 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -10062,8 +10062,21 @@ lookup_template_class_1 (tree d1, tree arglist, tree in_decl, tree context, } } - // Build template info for the new specialization. - SET_TYPE_TEMPLATE_INFO (t, build_template_info (found, arglist)); + /* 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)); elt.spec = t; slot = type_specializations->find_slot_with_hash (&elt, hash, INSERT); -- 2.30.2