* decl.c (duplicate_decls): Fix check for when it's safe to free
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 17 Apr 1998 00:26:13 +0000 (00:26 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 17 Apr 1998 00:26:13 +0000 (00:26 +0000)
the new decl.
* pt.c (mangle_class_name_for_template): Don't pass a typedef type
to type_as_string.
From Mark Mitchell:
(unify): Use comptypes to compare type args.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@19252 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 4bcf751..94e4029 100644 (file)
@@ -1,3 +1,13 @@
+Fri Apr 17 00:24:22 1998  Jason Merrill  <jason@yorick.cygnus.com>
+
+       * decl.c (duplicate_decls): Fix check for when it's safe to free
+       the new decl.
+
+       * pt.c (mangle_class_name_for_template): Don't pass a typedef type
+       to type_as_string.
+       From Mark Mitchell:
+       (unify): Use comptypes to compare type args.
+
 Thu Apr 16 17:47:30 1998  Jeffrey A Law  (law@cygnus.com)
 
        * pt.c (build_template_parm_index): Add prototype.
index cb2b005..8f5b90c 100644 (file)
@@ -3088,9 +3088,12 @@ duplicate_decls (newdecl, olddecl)
              TREE_VALUE (decls) = olddecl;
        }
 
-      if ((char *)newdecl + ROUND (function_size)
-         + ROUND (sizeof (struct lang_decl))
-         == obstack_next_free (&permanent_obstack))
+      if (((char *)newdecl + ROUND (function_size) == (char *)nl
+          && ((char *)newdecl + ROUND (function_size)
+              + ROUND (sizeof (struct lang_decl))
+              == obstack_next_free (&permanent_obstack)))
+         || ((char *)newdecl + ROUND (function_size)
+             == obstack_next_free (&permanent_obstack)))
        {
          DECL_MAIN_VARIANT (newdecl) = olddecl;
          DECL_LANG_SPECIFIC (olddecl) = ol;
index 76a2706..6fce6bb 100644 (file)
@@ -2546,9 +2546,15 @@ mangle_class_name_for_template (name, parms, arglist, ctx)
       char* s;
 
       if (TREE_CODE (ctx) == FUNCTION_DECL)
-       s = fndecl_as_string(ctx, 0);
+       s = fndecl_as_string (ctx, 0);
       else if (TREE_CODE_CLASS (TREE_CODE (ctx)) == 't')
-       s = type_as_string(ctx, 0);
+       {
+         /* We can't use a typedef type name here.  */
+         ctx = build_type_variant (TYPE_MAIN_VARIANT (ctx),
+                                   TYPE_READONLY (ctx),
+                                   TYPE_VOLATILE (ctx));
+         s = type_as_string (ctx, 0);
+       }
       else
        my_friendly_abort (0);
       cat (s);
@@ -2566,6 +2572,12 @@ mangle_class_name_for_template (name, parms, arglist, ctx)
       if (i)
        ccat (',');
 
+      /* We can't use a typedef type name here.  */
+      if (TREE_CODE_CLASS (TREE_CODE (arg)) == 't')
+       arg = build_type_variant (TYPE_MAIN_VARIANT (arg),
+                                 TYPE_READONLY (arg),
+                                 TYPE_VOLATILE (arg));
+
       if (TREE_CODE (parm) == TYPE_DECL)
        {
          cat (type_as_string (arg, 0));
@@ -5627,7 +5639,9 @@ unify (tparms, targs, ntparms, parm, arg, strict, explicit_mask)
       }
 #endif
       /* Simple cases: Value already set, does match or doesn't.  */
-      if (targ == arg || (targ && explicit_mask && explicit_mask[idx]))
+      if (targ != NULL_TREE 
+         && (comptypes (targ, arg, 1)
+             || (explicit_mask && explicit_mask[idx])))
        return 0;
       else if (targ)
        return 1;
@@ -5697,7 +5711,9 @@ unify (tparms, targs, ntparms, parm, arg, strict, explicit_mask)
        }
 
       /* Simple cases: Value already set, does match or doesn't.  */
-      if (targ == arg || (targ && explicit_mask && explicit_mask[idx]))
+      if (targ != NULL_TREE 
+         && (comptypes (targ, arg, 1)
+             || (explicit_mask && explicit_mask[idx])))
        return 0;
       else if (targ)
        return 1;