From 86cfdb4ea9bfb37fa1c9a573f20dd8e7c745b45f Mon Sep 17 00:00:00 2001 From: Trevor Saunders Date: Tue, 6 Jan 2015 02:02:27 +0000 Subject: [PATCH] remove tree_list from warn_hidden () cp/ * class.c (warn_hidden): Use auto_vec instead of tree_list to hold base_fndecls. (get_basefndecls): Adjust. From-SVN: r219212 --- gcc/cp/ChangeLog | 6 +++++ gcc/cp/class.c | 57 +++++++++++++++++++++++------------------------- 2 files changed, 33 insertions(+), 30 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index f7891db65f7..1163df3d427 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2015-01-05 Trevor Saunders + + * class.c (warn_hidden): Use auto_vec instead of tree_list to + hold base_fndecls. + (get_basefndecls): Adjust. + 2015-01-05 Jakub Jelinek Update copyright years. diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 557d9109a62..3b4aff89f7b 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -129,7 +129,7 @@ vec *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 *); 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 *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 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); + } } } -- 2.30.2