decl.c (duplicate_decls): Use same_type_p.
authorJason Merrill <jason@yorick.cygnus.com>
Sun, 14 Mar 1999 01:29:36 +0000 (01:29 +0000)
committerJason Merrill <jason@gcc.gnu.org>
Sun, 14 Mar 1999 01:29:36 +0000 (20:29 -0500)
* decl.c (duplicate_decls): Use same_type_p.
* method.c (try_old_backref): Renamed from flush_repeats.  Use
same_type_p.  Don't try to handle repeats.  Return success.
(is_back_referenceable_type): Return 0 if TYPE_FOR_JAVA.  Support
calls from old-style code, too.
(check_ktype): Use same_type_p.
(check_btype): Use same_type_p.  Don't pull out TYPE_MAIN_VARIANT.
(build_qualified_name): Simplify logic.
(build_mangled_name_for_type_with_Gcode): Remove call to
type_canonical_variant.
(process_overload_item): Strip typedefs and quals at the top.
(build_mangled_name): Likewise.  Remove support for old-style
repeats, which have been disabled since 2.7.2.  Don't mess with
TREE_USED.
(build_decl_overload_real): Don't mess with TREE_USED.

From-SVN: r25758

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

index 2f84019bea051b51f33bc18b6f36a6104a94cb76..b988aec2519ad8c527cf03a4d2c8a3448c661d64 100644 (file)
@@ -1,3 +1,21 @@
+1999-03-13  Jason Merrill  <jason@yorick.cygnus.com>
+
+       * decl.c (duplicate_decls): Use same_type_p.
+       * method.c (try_old_backref): Renamed from flush_repeats.  Use
+       same_type_p.  Don't try to handle repeats.  Return success.
+       (is_back_referenceable_type): Return 0 if TYPE_FOR_JAVA.  Support
+       calls from old-style code, too.
+       (check_ktype): Use same_type_p.
+       (check_btype): Use same_type_p.  Don't pull out TYPE_MAIN_VARIANT.
+       (build_qualified_name): Simplify logic.
+       (build_mangled_name_for_type_with_Gcode): Remove call to
+       type_canonical_variant.
+       (process_overload_item): Strip typedefs and quals at the top.
+       (build_mangled_name): Likewise.  Remove support for old-style 
+       repeats, which have been disabled since 2.7.2.  Don't mess with 
+       TREE_USED.
+       (build_decl_overload_real): Don't mess with TREE_USED.
+
 1999-03-13  Nathan Sidwell  <nathan@acm.org>
 
        * error.c (cp_printers): Add 'F' escape character.
index 1de303d3c0e7df853fb653f448513ffea5b5bb4c..2e7a94a725cc41e0f3ad020f1c6a42714d217994 100644 (file)
@@ -3242,7 +3242,7 @@ duplicate_decls (newdecl, olddecl)
       TREE_TYPE (newdecl) = TREE_TYPE (olddecl) = newtype;
 
       /* Lay the type out, unless already done.  */
-      if (newtype != canonical_type_variant (oldtype)
+      if (! same_type_p (newtype, oldtype)
          && TREE_TYPE (newdecl) != error_mark_node
          && !(processing_template_decl && uses_template_parms (newdecl)))
        layout_type (TREE_TYPE (newdecl));
index c2ac3f4e4514855ce346bf31a74a31acecfbb6e3..369dec62d6c5722cb8bcaeec3d765cfa50a0986d 100644 (file)
@@ -57,7 +57,7 @@ static char *scratch_firstobj;
 
 static void icat PROTO((HOST_WIDE_INT));
 static void dicat PROTO((HOST_WIDE_INT, HOST_WIDE_INT));
-static void flush_repeats PROTO((int, tree));
+static int try_old_backref PROTO((tree));
 static void build_overload_identifier PROTO((tree));
 static void build_overload_nested_name PROTO((tree));
 static void build_overload_int PROTO((tree, int));
@@ -299,28 +299,33 @@ dicat (lo, hi)
   OB_PUTC ('0' + ulo);
 }
 
-static __inline void
-flush_repeats (nrepeats, type)
-     int nrepeats;
+/* Old mangling style:  If TYPE has already been used in the parameter list,
+   emit a backward reference and return non-zero; otherwise, return 0.  */
+
+static __inline int
+try_old_backref (type)
      tree type;
 {
   int tindex = 0;
 
-  while (typevec[tindex] != type)
-    tindex++;
+  if (! is_back_referenceable_type (type))
+    return 0;
 
-  if (nrepeats > 1)
-    {
-      OB_PUTC ('N');
-      icat (nrepeats);
-      if (nrepeats > 9)
-       OB_PUTC ('_');
-    }
-  else
-    OB_PUTC ('T');
+  /* The entry for this parm is at maxtype-1, so don't look there for
+     something to repeat.  */
+  for (tindex = 0; tindex < maxtype - 1; ++tindex)
+    if (same_type_p (typevec[tindex], type))
+      break;
+
+  if (tindex == maxtype - 1)
+    return 0;
+
+  OB_PUTC ('T');
   icat (tindex);
   if (tindex > 9)
     OB_PUTC ('_');
+
+  return 1;
 }
 
 /* Returns nonzero iff this is a type to which we will want to make
@@ -330,8 +335,8 @@ static int
 is_back_referenceable_type (type)
      tree type;
 {
-  if (btypelist == NULL)
-    /* We're not generating any back-references.  */
+  /* For some reason, the Java folks don't want back refs on these.  */
+  if (TYPE_FOR_JAVA (type))
     return 0;
 
   switch (TREE_CODE (type)) 
@@ -377,8 +382,10 @@ issue_nrepeats (nrepeats, type)
     }
 }
 
-/* Check to see if a tree node has been entered into the Kcode typelist    */
-/* if not, add it. Return -1 if it isn't found, otherwise return the index */
+/* Check to see if a tree node has been entered into the Kcode typelist.
+   If not, add it.  Returns -1 if it isn't found, otherwise returns the
+   index.  */
+
 static int
 check_ktype (node, add)
      tree node;
@@ -395,10 +402,10 @@ check_ktype (node, add)
 
   for (x=0; x < maxktype; x++)
     {
-      if (localnode == ktypelist[x])
-        return x ;
+      if (same_type_p (localnode, ktypelist[x]))
+        return x;
     }
-  /* Didn't find it, so add it here */
+  /* Didn't find it, so add it here */
   if (add)
     {
       if (maxksize <= maxktype)
@@ -864,7 +871,7 @@ build_overload_value (type, value, in_template)
 
 
 /* Add encodings for the declaration of template template parameters.
-   PARMLIST must be a TREE_VEC */
+   PARMLIST must be a TREE_VEC */
 
 static void
 build_template_template_parm_names (parmlist)
@@ -921,9 +928,9 @@ build_template_parm_names (parmlist, arglist)
        }
       else if (TREE_CODE (parm) == TEMPLATE_DECL)
        {
-         /* This parameter is a template. */
+         /* This parameter is a template.  */
          if (TREE_CODE (arg) == TEMPLATE_TEMPLATE_PARM)
-           /* Output parameter declaration, argument index and level */
+           /* Output parameter declaration, argument index and level */
            build_mangled_name_for_type (arg);
          else
            {
@@ -931,7 +938,8 @@ build_template_parm_names (parmlist, arglist)
                 and template name */
 
              OB_PUTC ('z');
-             build_template_template_parm_names (DECL_INNERMOST_TEMPLATE_PARMS (parm));
+             build_template_template_parm_names
+               (DECL_INNERMOST_TEMPLATE_PARMS (parm));
              icat (IDENTIFIER_LENGTH (DECL_NAME (arg)));
              OB_PUTID (DECL_NAME (arg));
            }
@@ -1012,15 +1020,18 @@ build_qualified_name (decl)
     }
 
   context = decl;
-  /* if we can't find a Ktype, do it the hard way */
+  /* If we can't find a Ktype, do it the hard way.  */
   if (check_ktype (context, FALSE) == -1)
     {
-      /* count type and namespace scopes */
-      while (DECL_CONTEXT (context) && DECL_CONTEXT (context) != global_namespace)
+      /* Count type and namespace scopes.  */
+      while (1)
        {
+         context = CP_DECL_CONTEXT (context);
+         if (context == global_namespace)
+           break;
          i += 1;
-         context = DECL_CONTEXT (context);
-         if (check_ktype (context, FALSE) != -1)  /* found it! */
+         if (check_ktype (context, FALSE) != -1)
+           /* Found one!  */
            break;
          if (TREE_CODE_CLASS (TREE_CODE (context)) == 't')
            context = TYPE_NAME (context);
@@ -1047,7 +1058,6 @@ build_mangled_name_for_type_with_Gcode (type, extra_Gcode)
 {
   if (TYPE_PTRMEMFUNC_P (type))
     type = TYPE_PTRMEMFUNC_FN_TYPE (type);
-  type = canonical_type_variant (type);
   process_modifiers (type);
   process_overload_item (type, extra_Gcode);
 }
@@ -1111,20 +1121,25 @@ build_mangled_name (parmtypes, begin, end)
       for (; parmtypes && parmtypes != void_list_node;
           parmtypes = TREE_CHAIN (parmtypes))
        {
-         tree parmtype = canonical_type_variant (TREE_VALUE (parmtypes));
+         /* We used to call canonical_type_variant here, but that isn't
+            good enough; it doesn't handle pointers to typedef types.  So
+            we can't just set TREE_USED to say we've seen a type already;
+            we have to check each of the earlier types with same_type_p.  */
+         tree parmtype = TREE_VALUE (parmtypes);
 
          if (old_style_repeats)
            {
+             /* Note that for bug-compatibility with 2.7.2, we can't build
+                up repeats.  So we call try_old_backref (formerly
+                flush_repeats) every round, and only emit Tn codes.  */
+
              /* Every argument gets counted.  */
              my_friendly_assert (maxtype < typevec_size, 387);
              typevec[maxtype++] = parmtype;
            }
-
-         if (parmtype == last_type)
+         else if (flag_do_squangling)
            {
-             if (flag_do_squangling 
-                 || (old_style_repeats && TREE_USED (parmtype)
-                     && !TYPE_FOR_JAVA (parmtype)))
+             if (last_type && same_type_p (parmtype, last_type))
                {
                  /* The next type is the same as this one.  Keep
                     track of the repetition, and output the repeat
@@ -1132,49 +1147,19 @@ build_mangled_name (parmtypes, begin, end)
                  nrepeats++;
                  continue;
                }
-           }
-         else if (nrepeats != 0)
-           {
-             /* Indicate how many times the previous parameter was
-                repeated.  */
-             if (old_style_repeats)
-               flush_repeats (nrepeats, last_type);
-             else
-               issue_nrepeats (nrepeats, last_type);
-             nrepeats = 0;
-           }
-         
-         last_type = parmtype;
-
-         if (old_style_repeats)
-           {
-             if (nrepeats)
-               {
-                 flush_repeats (nrepeats, last_type);
-                 nrepeats = 0;
-               }
-
-             if (TREE_USED (parmtype))
+             else if (nrepeats != 0)
                {
-#if 0
-                 /* We can turn this on at some point when we want
-                    improved symbol mangling.  */
-                 nrepeats++;
-#else
-                 /* This is bug compatible with 2.7.x  */
-                 flush_repeats (nrepeats, parmtype);
-#endif
+                 /* Indicate how many times the previous parameter was
+                    repeated.  */
+                 issue_nrepeats (nrepeats, last_type);
                  nrepeats = 0;
-                 continue;
                }
-             
-             /* Only cache types which take more than one character.  */
-             if ((parmtype != TYPE_MAIN_VARIANT (parmtype)
-                  || (TREE_CODE (parmtype) != INTEGER_TYPE
-                      && TREE_CODE (parmtype) != REAL_TYPE))
-                 && ! TYPE_FOR_JAVA (parmtype))
-               TREE_USED (parmtype) = 1;
            }
+         
+         last_type = parmtype;
+
+         if (old_style_repeats && try_old_backref (parmtype))
+           continue;
 
          /* Output the PARMTYPE.  */
          build_mangled_name_for_type_with_Gcode (parmtype, 1);
@@ -1184,10 +1169,7 @@ build_mangled_name (parmtypes, begin, end)
         necessary.  */
       if (nrepeats != 0)
        {
-         if (old_style_repeats)
-           flush_repeats (nrepeats, last_type);
-         else
-           issue_nrepeats (nrepeats, last_type);
+         issue_nrepeats (nrepeats, last_type);
          nrepeats = 0;
        }
 
@@ -1243,12 +1225,8 @@ check_btype (type)
   if (!is_back_referenceable_type (type))
     return 0;
 
-  /* We assume that our caller has put out any necessary
-     qualifiers.  */
-  type = TYPE_MAIN_VARIANT (type);
-
   for (x = 0; x < maxbtype; x++) 
-    if (type == btypelist[x]) 
+    if (same_type_p (type, btypelist[x]))
       {
        OB_PUTC ('B');
        icat (x);
@@ -1279,6 +1257,14 @@ process_overload_item (parmtype, extra_Gcode)
 {
   numeric_output_need_bar = 0;
 
+  /* Our caller should have already handed any qualifiers, so pull out the
+     TYPE_MAIN_VARIANT to avoid typedef confusion.  Except we can't do that
+     for arrays, because they are transparent to qualifiers.  Sigh.  */
+  if (TREE_CODE (parmtype) == ARRAY_TYPE)
+    parmtype = canonical_type_variant (parmtype);
+  else
+    parmtype = TYPE_MAIN_VARIANT (parmtype);
+
   /* These tree types are considered modifiers for B code squangling,
      and therefore should not get entries in the Btypelist.  They are,
      however, repeatable types.  */
@@ -1382,7 +1368,6 @@ process_overload_item (parmtype, extra_Gcode)
       }
 
     case INTEGER_TYPE:
-      parmtype = TYPE_MAIN_VARIANT (parmtype);
       if (parmtype == integer_type_node
           || parmtype == unsigned_type_node
          || parmtype == java_int_type_node)
@@ -1431,7 +1416,6 @@ process_overload_item (parmtype, extra_Gcode)
       break;
 
     case REAL_TYPE:
-      parmtype = TYPE_MAIN_VARIANT (parmtype);
       if (parmtype == long_double_type_node)
         OB_PUTC ('r');
       else if (parmtype == double_type_node
@@ -1609,12 +1593,13 @@ build_decl_overload_real (dname, parms, ret_type, tparms, targs,
     OB_PUTC ('v');
   else
     {
-      if (!flag_do_squangling)    /* Allocate typevec array. */
+      if (!flag_do_squangling)
         {
+         /* Allocate typevec array.  */
           maxtype = 0;
          typevec_size = list_length (parms);
          if (!for_method && current_namespace != global_namespace)
-           /* the namespace of a global function needs one slot */
+           /* The namespace of a global function needs one slot.  */
            typevec_size++;
           typevec = (tree *)alloca (typevec_size * sizeof (tree));
         }
@@ -1635,12 +1620,6 @@ build_decl_overload_real (dname, parms, ret_type, tparms, targs,
            {
              my_friendly_assert (maxtype < typevec_size, 387);
              typevec[maxtype++] = this_type;
-             TREE_USED (this_type) = 1;
-
-             /* By setting up PARMS in this way, the loop below will
-                automatically clear TREE_USED on THIS_TYPE.  */
-             parms = temp_tree_cons (NULL_TREE, this_type,
-                                     TREE_CHAIN (parms));
            }
 
          if (TREE_CHAIN (parms))
@@ -1661,20 +1640,9 @@ build_decl_overload_real (dname, parms, ret_type, tparms, targs,
          build_mangled_name (parms, 0, 0);
        }
 
-      if (!flag_do_squangling)     /* Deallocate typevec array */
-        {
-          tree t = parms;
-          typevec = NULL;
-          while (t)
-            {
-              tree temp = TREE_VALUE (t);
-              TREE_USED (temp) = 0;
-              /* clear out the type variant in case we used it */
-              temp = canonical_type_variant (temp);
-              TREE_USED (temp) = 0;
-              t = TREE_CHAIN (t);
-            }
-        }
+      if (!flag_do_squangling)
+       /* Deallocate typevec array.  */
+       typevec = NULL;
     }
 
   if (ret_type != NULL_TREE && for_method != 2)