diff options
author | Nathan Sidwell <nathan@acm.org> | 2017-06-29 14:38:09 +0000 |
---|---|---|
committer | Nathan Sidwell <nathan@gcc.gnu.org> | 2017-06-29 14:38:09 +0000 |
commit | 56b2a94b4377c86118f43297f7def1ff7d0b0e65 (patch) | |
tree | 2fba0f27577752747ea9c39055b84df584d17c17 | |
parent | 79a2e690b4654e88437aa40627f24068dc5216f5 (diff) | |
download | gcc-56b2a94b4377c86118f43297f7def1ff7d0b0e65.zip gcc-56b2a94b4377c86118f43297f7def1ff7d0b0e65.tar.gz gcc-56b2a94b4377c86118f43297f7def1ff7d0b0e65.tar.bz2 |
call.c (check_dtor_name): Use constructor_name for enums too.
* 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.
From-SVN: r249789
-rw-r--r-- | gcc/cp/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/cp/call.c | 14 | ||||
-rw-r--r-- | gcc/cp/class.c | 5 | ||||
-rw-r--r-- | gcc/cp/name-lookup.c | 15 |
4 files changed, 23 insertions, 20 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b91a6e0..cd1252b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,14 @@ 2017-06-29 Nathan Sidwell <nathan@acm.org> + * 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 b83ffa8..0675820 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<tree, va_gc> **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 2caf6fc..c7ea3f4 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 2ca71b6..1f492a4 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)) |