aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@acm.org>2017-06-29 14:38:09 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2017-06-29 14:38:09 +0000
commit56b2a94b4377c86118f43297f7def1ff7d0b0e65 (patch)
tree2fba0f27577752747ea9c39055b84df584d17c17
parent79a2e690b4654e88437aa40627f24068dc5216f5 (diff)
downloadgcc-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/ChangeLog9
-rw-r--r--gcc/cp/call.c14
-rw-r--r--gcc/cp/class.c5
-rw-r--r--gcc/cp/name-lookup.c15
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))