remove tree_list from warn_hidden ()
authorTrevor Saunders <tsaunders@mozilla.com>
Tue, 6 Jan 2015 02:02:27 +0000 (02:02 +0000)
committerTrevor Saunders <tbsaunde@gcc.gnu.org>
Tue, 6 Jan 2015 02:02:27 +0000 (02:02 +0000)
cp/

* class.c (warn_hidden): Use auto_vec<tree> instead of tree_list to
hold base_fndecls.
(get_basefndecls): Adjust.

From-SVN: r219212

gcc/cp/ChangeLog
gcc/cp/class.c

index f7891db65f7a47f8bde0699e575230c16934b233..1163df3d427c158f2b1b5c52de9a4dac0212aa59 100644 (file)
@@ -1,3 +1,9 @@
+2015-01-05  Trevor Saunders  <tsaunders@mozilla.com>
+
+       * class.c (warn_hidden): Use auto_vec<tree> instead of tree_list to
+       hold base_fndecls.
+       (get_basefndecls): Adjust.
+
 2015-01-05  Jakub Jelinek  <jakub@redhat.com>
 
        Update copyright years.
index 557d9109a6284e7470bb4d8d6ea2573b6f7ea242..3b4aff89f7b219bb06b6e0c11f533b965a8137c0 100644 (file)
@@ -129,7 +129,7 @@ vec<tree, va_gc> *local_classes;
 static tree get_vfield_name (tree);
 static void finish_struct_anon (tree);
 static tree get_vtable_name (tree);
-static tree get_basefndecls (tree, tree);
+static void get_basefndecls (tree, tree, vec<tree> *);
 static int build_primary_vtable (tree, tree);
 static int build_secondary_vtable (tree);
 static void finish_vtbls (tree);
@@ -2751,16 +2751,16 @@ modify_all_vtables (tree t, tree virtuals)
 /* Get the base virtual function declarations in T that have the
    indicated NAME.  */
 
-static tree
-get_basefndecls (tree name, tree t)
+static void
+get_basefndecls (tree name, tree t, vec<tree> *base_fndecls)
 {
   tree methods;
-  tree base_fndecls = NULL_TREE;
   int n_baseclasses = BINFO_N_BASE_BINFOS (TYPE_BINFO (t));
   int i;
 
   /* Find virtual functions in T with the indicated NAME.  */
   i = lookup_fnfields_1 (t, name);
+  bool found_decls = false;
   if (i != -1)
     for (methods = (*CLASSTYPE_METHOD_VEC (t))[i];
         methods;
@@ -2770,20 +2770,20 @@ get_basefndecls (tree name, tree t)
 
        if (TREE_CODE (method) == FUNCTION_DECL
            && DECL_VINDEX (method))
-         base_fndecls = tree_cons (NULL_TREE, method, base_fndecls);
+         {
+           base_fndecls->safe_push (method);
+           found_decls = true;
+         }
       }
 
-  if (base_fndecls)
-    return base_fndecls;
+  if (found_decls)
+    return;
 
   for (i = 0; i < n_baseclasses; i++)
     {
       tree basetype = BINFO_TYPE (BINFO_BASE_BINFO (TYPE_BINFO (t), i));
-      base_fndecls = chainon (get_basefndecls (name, basetype),
-                             base_fndecls);
+      get_basefndecls (name, basetype, base_fndecls);
     }
-
-  return base_fndecls;
 }
 
 /* If this declaration supersedes the declaration of
@@ -2845,7 +2845,6 @@ warn_hidden (tree t)
       tree fn;
       tree name;
       tree fndecl;
-      tree base_fndecls;
       tree base_binfo;
       tree binfo;
       int j;
@@ -2854,19 +2853,18 @@ warn_hidden (tree t)
         have the same name.  Figure out what name that is.  */
       name = DECL_NAME (OVL_CURRENT (fns));
       /* There are no possibly hidden functions yet.  */
-      base_fndecls = NULL_TREE;
+      auto_vec<tree, 20> base_fndecls;
       /* Iterate through all of the base classes looking for possibly
         hidden functions.  */
       for (binfo = TYPE_BINFO (t), j = 0;
           BINFO_BASE_ITERATE (binfo, j, base_binfo); j++)
        {
          tree basetype = BINFO_TYPE (base_binfo);
-         base_fndecls = chainon (get_basefndecls (name, basetype),
-                                 base_fndecls);
+         get_basefndecls (name, basetype, &base_fndecls);
        }
 
       /* If there are no functions to hide, continue.  */
-      if (!base_fndecls)
+      if (base_fndecls.is_empty ())
        continue;
 
       /* Remove any overridden functions.  */
@@ -2876,28 +2874,27 @@ warn_hidden (tree t)
          if (TREE_CODE (fndecl) == FUNCTION_DECL
              && DECL_VINDEX (fndecl))
            {
-             tree *prev = &base_fndecls;
-
-             while (*prev)
                /* If the method from the base class has the same
                   signature as the method from the derived class, it
                   has been overridden.  */
-               if (same_signature_p (fndecl, TREE_VALUE (*prev)))
-                 *prev = TREE_CHAIN (*prev);
-               else
-                 prev = &TREE_CHAIN (*prev);
+               for (size_t k = 0; k < base_fndecls.length (); k++)
+               if (base_fndecls[k]
+                   && same_signature_p (fndecl, base_fndecls[k]))
+                 base_fndecls[k] = NULL_TREE;
            }
        }
 
       /* Now give a warning for all base functions without overriders,
         as they are hidden.  */
-      while (base_fndecls)
-       {
-         /* Here we know it is a hider, and no overrider exists.  */
-         warning (OPT_Woverloaded_virtual, "%q+D was hidden", TREE_VALUE (base_fndecls));
-         warning (OPT_Woverloaded_virtual, "  by %q+D", fns);
-         base_fndecls = TREE_CHAIN (base_fndecls);
-       }
+      size_t k;
+      tree base_fndecl;
+      FOR_EACH_VEC_ELT (base_fndecls, k, base_fndecl)
+       if (base_fndecl)
+         {
+             /* Here we know it is a hider, and no overrider exists.  */
+             warning (OPT_Woverloaded_virtual, "%q+D was hidden", base_fndecl);
+             warning (OPT_Woverloaded_virtual, "  by %q+D", fns);
+         }
     }
 }