decl.c (duplicate_decls): When combining typedefs, remove the new type from the varia...
authorJason Merrill <jason@redhat.com>
Thu, 12 Nov 2015 01:16:59 +0000 (20:16 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 12 Nov 2015 01:16:59 +0000 (20:16 -0500)
* decl.c (duplicate_decls): When combining typedefs, remove the
new type from the variants list.

From-SVN: r230202

gcc/cp/ChangeLog
gcc/cp/decl.c

index 9cbda291ac7a58f95a21df5b2a8e9e23c1cd9ed8..d1bf1219e00f10b517d5712e3b8b3192c333ff77 100644 (file)
@@ -1,3 +1,8 @@
+2015-11-11  Jason Merrill  <jason@redhat.com>
+
+       * decl.c (duplicate_decls): When combining typedefs, remove the
+       new type from the variants list.
+
 2015-11-11  Jason Merrill  <jason@redhat.com>
 
        * pt.c (instantiate_class_template_1): Set function_depth around
index 76cc1d176e54dcc7b5dd67342bd36fa56b704725..383b47d29edd9de2a5631e01088a1558e0f55d31 100644 (file)
@@ -2014,7 +2014,22 @@ duplicate_decls (tree newdecl, tree olddecl, bool newdecl_is_friend)
       /* For typedefs use the old type, as the new type's DECL_NAME points
         at newdecl, which will be ggc_freed.  */
       if (TREE_CODE (newdecl) == TYPE_DECL)
-       newtype = oldtype;
+       {
+         newtype = oldtype;
+
+         /* And remove the new type from the variants list.  */
+         if (TYPE_NAME (TREE_TYPE (newdecl)) == newdecl)
+           {
+             tree remove = TREE_TYPE (newdecl);
+             for (tree t = TYPE_MAIN_VARIANT (remove); ;
+                  t = TYPE_NEXT_VARIANT (t))
+               if (TYPE_NEXT_VARIANT (t) == remove)
+                 {
+                   TYPE_NEXT_VARIANT (t) = TYPE_NEXT_VARIANT (remove);
+                   break;
+                 }
+           }
+       }
       else
        /* Merge the data types specified in the two decls.  */
        newtype = merge_types (TREE_TYPE (newdecl), TREE_TYPE (olddecl));