static void
warn_hidden (tree t)
{
- vec<tree, va_gc> *method_vec = CLASSTYPE_METHOD_VEC (t);
- tree fns;
+ if (vec<tree, va_gc> *method_vec = CLASSTYPE_METHOD_VEC (t))
+ for (unsigned ix = method_vec->length (); ix--;)
+ {
+ tree fns = (*method_vec)[ix];
- /* We go through each separately named virtual function. */
- for (int i = 0; vec_safe_iterate (method_vec, i, &fns); ++i)
- {
- tree name = OVL_NAME (fns);
- auto_vec<tree, 20> base_fndecls;
- tree base_binfo;
- tree binfo;
- int j;
+ if (!OVL_P (fns))
+ continue;
- /* 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);
- get_basefndecls (name, basetype, &base_fndecls);
- }
+ tree name = OVL_NAME (fns);
+ auto_vec<tree, 20> base_fndecls;
+ tree base_binfo;
+ tree binfo;
+ unsigned j;
- /* If there are no functions to hide, continue. */
- if (base_fndecls.is_empty ())
- continue;
+ /* 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);
+ get_basefndecls (name, basetype, &base_fndecls);
+ }
- /* Remove any overridden functions. */
- for (ovl_iterator iter (fns); iter; ++iter)
- {
- tree fndecl = *iter;
- if (TREE_CODE (fndecl) == FUNCTION_DECL
- && DECL_VINDEX (fndecl))
- {
- /* If the method from the base class has the same
- signature as the method from the derived class, it
- has been overridden. */
- 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;
- }
- }
+ /* If there are no functions to hide, continue. */
+ if (base_fndecls.is_empty ())
+ continue;
- /* Now give a warning for all base functions without overriders,
- as they are hidden. */
- size_t k;
- tree base_fndecl;
- FOR_EACH_VEC_ELT (base_fndecls, k, base_fndecl)
- if (base_fndecl)
+ /* Remove any overridden functions. */
+ for (ovl_iterator iter (fns); iter; ++iter)
{
- /* Here we know it is a hider, and no overrider exists. */
- warning_at (location_of (base_fndecl),
- OPT_Woverloaded_virtual,
- "%qD was hidden", base_fndecl);
- warning_at (location_of (fns),
- OPT_Woverloaded_virtual, " by %qD", fns);
+ tree fndecl = *iter;
+ if (TREE_CODE (fndecl) == FUNCTION_DECL
+ && DECL_VINDEX (fndecl))
+ {
+ /* If the method from the base class has the same
+ signature as the method from the derived class, it
+ has been overridden. */
+ 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. */
+ tree base_fndecl;
+ FOR_EACH_VEC_ELT (base_fndecls, j, base_fndecl)
+ if (base_fndecl)
+ {
+ /* Here we know it is a hider, and no overrider exists. */
+ warning_at (location_of (base_fndecl),
+ OPT_Woverloaded_virtual,
+ "%qD was hidden", base_fndecl);
+ warning_at (location_of (fns),
+ OPT_Woverloaded_virtual, " by %qD", fns);
+ }
+ }
}
/* Recursive helper for finish_struct_anon. */
/* For the TYPE_FIELDS, only the non TYPE_DECLs are in reverse
order, so we can't just use nreverse. Due to stat_hack
- chicanery in finish_member_declarations. */
+ chicanery in finish_member_declaration. */
prev = NULL_TREE;
for (x = TYPE_FIELDS (t);
x && TREE_CODE (x) != TYPE_DECL;