c++: tpl-tpl-parms are not canonicalizable types [pr94454]
authorNathan Sidwell <nathan@acm.org>
Mon, 20 Apr 2020 13:52:30 +0000 (06:52 -0700)
committerNathan Sidwell <nathan@acm.org>
Mon, 20 Apr 2020 13:52:30 +0000 (06:52 -0700)
We treat tpl-tpl-parms as types.  They're not; bound-tpl-tpl-parms
are.  We can get away with them being type-like.  Unfortunately we
give the original level==orig_level case a canonical type, but the
reduced cases of level<orig_level get structural equality.  This patch
gives them structural type always.

* pt.c (canonical_type_parameter): Assert not a tpl-tpl-parm.
(process_template_parm): tpl-tpl-parms are structural.
(rewrite_template_parm): Propagate structuralness.

gcc/cp/ChangeLog
gcc/cp/pt.c

index 49db85d1c1ae04db1c206c45bb45a883763bfdb3..e210eb5b80e9992bde79eab00f6769eaab4501eb 100644 (file)
@@ -1,5 +1,10 @@
 2020-04-20  Nathan Sidwell  <nathan@acm.org>
 
+       PR 94454 - tpl-tpl-parms are not canonicalizable types
+       * pt.c (canonical_type_parameter): Assert not a tpl-tpl-parm.
+       (process_template_parm): tpl-tpl-parms are structural.
+       (rewrite_template_parm): Propagate structuralness.
+
        PR 94454 - Expr pack expansion equality
        * tree.c (cp_tree_equal): [TEMPLATE_ID_EXPR, default] Refactor.
        [EXPR_PACK_EXPANSION]: Add.
index 4814b768c2caaaa81b3bf19fa884cc1d26e826e8..4f4c04e7df8961dcc4e0c826724c66f6f49e6f90 100644 (file)
@@ -4399,6 +4399,9 @@ canonical_type_parameter (tree type)
 {
   tree list;
   int idx = TEMPLATE_TYPE_IDX (type);
+
+  gcc_assert (TREE_CODE (type) != TEMPLATE_TEMPLATE_PARM);
+
   if (!canonical_template_parms)
     vec_alloc (canonical_template_parms, idx + 1);
 
@@ -4581,7 +4584,10 @@ process_template_parm (tree list, location_t parm_loc, tree parm,
                                     processing_template_decl,
                                     decl, TREE_TYPE (parm));
       TEMPLATE_TYPE_PARAMETER_PACK (t) = is_parameter_pack;
-      TYPE_CANONICAL (t) = canonical_type_parameter (t);
+      if (TREE_CODE (t) == TEMPLATE_TEMPLATE_PARM)
+       SET_TYPE_STRUCTURAL_EQUALITY (t);
+      else
+       TYPE_CANONICAL (t) = canonical_type_parameter (t);
     }
   DECL_ARTIFICIAL (decl) = 1;
   SET_DECL_TEMPLATE_PARM_P (decl);
@@ -28022,7 +28028,10 @@ rewrite_template_parm (tree olddecl, unsigned index, unsigned level,
       TEMPLATE_PARM_PARAMETER_PACK (newidx)
        = TEMPLATE_PARM_PARAMETER_PACK (oldidx);
       TYPE_STUB_DECL (newtype) = TYPE_NAME (newtype) = newdecl;
-      TYPE_CANONICAL (newtype) = canonical_type_parameter (newtype);
+      if (TYPE_STRUCTURAL_EQUALITY_P (TREE_TYPE (olddecl)))
+       SET_TYPE_STRUCTURAL_EQUALITY (newtype);
+      else
+       TYPE_CANONICAL (newtype) = canonical_type_parameter (newtype);
 
       if (TREE_CODE (olddecl) == TEMPLATE_DECL)
        {