From 940ab2e08e241437c176aad1ad5bf2a2a2849809 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Wed, 6 Sep 2017 13:19:49 +0000 Subject: [PATCH] class.c (warn_hidden): Don't barf on non-functions. * class.c (warn_hidden): Don't barf on non-functions. * decl2.c (check_classfn): Likewise. Check template match earlier. From-SVN: r251795 --- gcc/cp/ChangeLog | 3 ++ gcc/cp/class.c | 103 ++++++++++++++++++++++++----------------------- gcc/cp/decl2.c | 14 ++++--- 3 files changed, 64 insertions(+), 56 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ed98902fd42..a48237235ba 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2017-09-06 Nathan Sidwell + * class.c (warn_hidden): Don't barf on non-functions. + * decl2.c (check_classfn): Likewise. Check template match earlier. + * name-lookup.c (count_fields): Rename to ... (count_class_fields): ... here. Take a class, don't count NULL-named fields. diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 908edc4f490..1390dc39bef 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -2818,63 +2818,64 @@ check_for_override (tree decl, tree ctype) static void warn_hidden (tree t) { - vec *method_vec = CLASSTYPE_METHOD_VEC (t); - tree fns; + if (vec *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 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 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. */ @@ -6981,7 +6982,7 @@ unreverse_member_declarations (tree t) /* 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; diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index d950a851cb9..2bde588847e 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -611,6 +611,15 @@ check_classfn (tree ctype, tree function, tree template_parms) for (ovl_iterator iter (fns); !matched && iter; ++iter) { tree fndecl = *iter; + + /* A member template definition only matches a member template + declaration. */ + if (is_template != (TREE_CODE (fndecl) == TEMPLATE_DECL)) + continue; + + if (!DECL_DECLARES_FUNCTION_P (fndecl)) + continue; + tree p1 = TYPE_ARG_TYPES (TREE_TYPE (function)); tree p2 = TYPE_ARG_TYPES (TREE_TYPE (fndecl)); @@ -625,11 +634,6 @@ check_classfn (tree ctype, tree function, tree template_parms) && TREE_CODE (TREE_TYPE (function)) == METHOD_TYPE) p1 = TREE_CHAIN (p1); - /* A member template definition only matches a member template - declaration. */ - if (is_template != (TREE_CODE (fndecl) == TEMPLATE_DECL)) - continue; - /* ref-qualifier or absence of same must match. */ if (type_memfn_rqual (TREE_TYPE (function)) != type_memfn_rqual (TREE_TYPE (fndecl))) -- 2.30.2