call.c (check_dtor_name): Use constructor_name for enums too.
authorNathan Sidwell <nathan@acm.org>
Thu, 29 Jun 2017 14:38:09 +0000 (14:38 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Thu, 29 Jun 2017 14:38:09 +0000 (14:38 +0000)
* 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

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/cp/class.c
gcc/cp/name-lookup.c

index b91a6e072ae463879663160bb34c893c9a576743..cd1252beeda0c3bc130afc90358a1461788d919f 100644 (file)
@@ -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.
index b83ffa8213d87f20151824f06fa08bc364a9d988..06758203b89e7682f8ab441d8f67f3ae0b08c021 100644 (file)
@@ -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);
index 2caf6fc374bd30f8612230a9fd23d2a3f0e40d1a..c7ea3f4f5002c22a39429385cd97d9d41fc857ff 100644 (file)
@@ -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;
index 2ca71b6a5f0ed32f23ea4c55f67594591504ac4e..1f492a4898f8896df544cbc7e66825c36aa17486 100644 (file)
@@ -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))