[gcc(refs/users/guojiufu/heads/guojiufu-branch)] c++: Alias template instantiation template info

Jiu Fu Guo guojiufu@gcc.gnu.org
Wed Jun 10 02:58:03 GMT 2020


https://gcc.gnu.org/g:74744bb1f2847b5b9ce3e97e0fec9c23bb0e499f

commit 74744bb1f2847b5b9ce3e97e0fec9c23bb0e499f
Author: Nathan Sidwell <nathan@acm.org>
Date:   Tue May 19 13:29:19 2020 -0700

    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.

Diff:
---
 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  <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
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);


More information about the Gcc-cvs mailing list