From 6c26e5e501f7f023dfe102071ed2bfa812eab6e6 Mon Sep 17 00:00:00 2001 From: nathan Date: Thu, 29 Jun 2017 14:38:09 +0000 Subject: [PATCH] * call.c (check_dtor_name): Use constructor_name for enums too. (build_new_method_call_1): Use constructor_name for cdtors and show ~ for dtor. * class.c (build_self_reference): Use TYPE_NAME to get name of self reference. * name-lookup (constructor_name): Use DECL_NAME directly. (constructor_name_p): Reimplement. (push_class_level_binding_1): Use TYPE_NAME directly. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@249789 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 9 +++++++++ gcc/cp/call.c | 14 +++++++------- gcc/cp/class.c | 5 ++--- gcc/cp/name-lookup.c | 15 +++++---------- 4 files changed, 23 insertions(+), 20 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b91a6e072ae..cd1252beeda 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,14 @@ 2017-06-29 Nathan Sidwell + * call.c (check_dtor_name): Use constructor_name for enums too. + (build_new_method_call_1): Use constructor_name for cdtors and + show ~ for dtor. + * class.c (build_self_reference): Use TYPE_NAME to get name of + self reference. + * name-lookup (constructor_name): Use DECL_NAME directly. + (constructor_name_p): Reimplement. + (push_class_level_binding_1): Use TYPE_NAME directly. + * class.c (finish_struct): Use OVL_P. (get_vfield_name): Measure constructor_name length. * cp-tree.h (SET_CLASS_TYPE_P): Add RECORD_OR_UNION_CHECK. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index b83ffa8213d..06758203b89 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -231,9 +231,8 @@ check_dtor_name (tree basetype, tree name) else if (identifier_p (name)) { if ((MAYBE_CLASS_TYPE_P (basetype) - && name == constructor_name (basetype)) - || (TREE_CODE (basetype) == ENUMERAL_TYPE - && name == TYPE_IDENTIFIER (basetype))) + || TREE_CODE (basetype) == ENUMERAL_TYPE) + && name == constructor_name (basetype)) return true; else name = get_type_value (name); @@ -9139,17 +9138,18 @@ build_new_method_call_1 (tree instance, tree fns, vec **args, { tree arglist = build_tree_list_vec (user_args); tree errname = name; + bool twiddle = false; if (IDENTIFIER_CDTOR_P (errname)) { - tree fn = DECL_ORIGIN (OVL_FIRST (fns)); - errname = DECL_NAME (fn); + twiddle = IDENTIFIER_DTOR_P (errname); + errname = constructor_name (basetype); } if (explicit_targs) errname = lookup_template_function (errname, explicit_targs); if (skip_first_for_error) arglist = TREE_CHAIN (arglist); - error ("no matching function for call to %<%T::%E(%A)%#V%>", - basetype, errname, arglist, + error ("no matching function for call to %<%T::%s%E(%A)%#V%>", + basetype, &"~"[!twiddle], errname, arglist, TREE_TYPE (instance)); } print_z_candidates (location_of (name), candidates); diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 2caf6fc374b..c7ea3f4f500 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -8550,9 +8550,8 @@ print_class_statistics (void) void build_self_reference (void) { - tree name = constructor_name (current_class_type); + tree name = DECL_NAME (TYPE_NAME (current_class_type)); tree value = build_lang_decl (TYPE_DECL, name, current_class_type); - tree saved_cas; DECL_NONLOCAL (value) = 1; DECL_CONTEXT (value) = current_class_type; @@ -8563,7 +8562,7 @@ build_self_reference (void) if (processing_template_decl) value = push_template_decl (value); - saved_cas = current_access_specifier; + tree saved_cas = current_access_specifier; current_access_specifier = access_public_node; finish_member_declaration (value); current_access_specifier = saved_cas; diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index 2ca71b6a5f0..1f492a4898f 100644 --- a/gcc/cp/name-lookup.c +++ b/gcc/cp/name-lookup.c @@ -3188,7 +3188,9 @@ set_identifier_type_value (tree id, tree decl) tree constructor_name (tree type) { - return TYPE_IDENTIFIER (TYPE_MAIN_VARIANT (type)); + tree decl = TYPE_NAME (TYPE_MAIN_VARIANT (type)); + + return decl ? DECL_NAME (decl) : NULL_TREE; } /* Returns TRUE if NAME is the name for the constructor for TYPE, @@ -3199,19 +3201,12 @@ constructor_name_p (tree name, tree type) { gcc_assert (MAYBE_CLASS_TYPE_P (type)); - if (!name) - return false; - - if (!identifier_p (name)) - return false; - /* These don't have names. */ if (TREE_CODE (type) == DECLTYPE_TYPE || TREE_CODE (type) == TYPEOF_TYPE) return false; - tree ctor_name = constructor_name (type); - if (name == ctor_name) + if (name && name == constructor_name (type)) return true; return false; @@ -3962,7 +3957,7 @@ push_class_level_binding_1 (tree name, tree x) /* A data member of an anonymous union. */ || (TREE_CODE (x) == FIELD_DECL && DECL_CONTEXT (x) != current_class_type)) - && DECL_NAME (x) == constructor_name (current_class_type)) + && DECL_NAME (x) == DECL_NAME (TYPE_NAME (current_class_type))) { tree scope = context_for_name_lookup (x); if (TYPE_P (scope) && same_type_p (scope, current_class_type)) -- 2.11.4.GIT