c++: Alias template instantiation template info
authorNathan Sidwell <nathan@acm.org>
Tue, 19 May 2020 20:29:19 +0000 (13:29 -0700)
committerNathan Sidwell <nathan@acm.org>
Tue, 19 May 2020 20:29:19 +0000 (13:29 -0700)
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
gcc/cp/pt.c

index 87d1ce76bc8f899a0ab58a075b1eae5d6ef87cab..a81a6200ff59acd223a2e11c82adf886a3809e5c 100644 (file)
@@ -1,3 +1,8 @@
+2020-05-19  Nathan Sidwell  <nathan@acm.org>
+
+       * pt.c (lookup_template_class_1): Do not reinit template_info of an
+       alias here.
+
 2020-05-18  Martin Sebor  <msebor@redhat.com>
 
        PR c++/94923
index 4d9651acee65be392a53fc004cbb9cb94c0ed88d..c17a038c6d0100288b8b84d2e9f066ce8f87f45c 100644 (file)
@@ -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);