]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[C++ PATCH] overloaded operator fns [1/N]
authorNathan Sidwell <nathan@acm.org>
Tue, 31 Oct 2017 12:50:19 +0000 (12:50 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Tue, 31 Oct 2017 12:50:19 +0000 (12:50 +0000)
https://gcc.gnu.org/ml/gcc-patches/2017-10/msg02315.html
* cp-tree.h (assign_op_identifier, call_op_identifier): Define.
(LAMBDA_FUNCTION_P): Use DECL_OVERLOADED_OPERATOR_IS.
(DECL_OVERLOADED_OPERATOR_P): Just retuurn true/false.
(DECL_OVERLOADED_OPERATOR_CODE, DECL_OVERLOADED_OPERATOR_IS): Define.
* call.c (add_function_candidate): Use
DECL_OVERLOADED_OPERATOR_IS.
(build_op_call_1): Use call_op_identifier &
DECL_OVERLOADED_OPERATOR_IS.
(build_over_call): Likewise.
(has_trivial_copy_assign_p): Use assign_op_identifier.
(build_special_member_call): Likewise.
* class.c (dfs_declare_virt_assop_and_dtor): Likewise.
(vbase_has_user_provided_move_assign,
classtype_has_move_assign_or_move_ctor_p): Likewise.
* decl.c (duplicate_decls): Use DECL_OVERLOADED_OPERATOR_CODE.
(grok_special_member_properties): Use assign_op_identifier.
(start_preparsed_function): Use DECL_OVERLOADED_OPERATOR_IS.
* decl2.c (mark_used): Use DECL_CONV_FN_P.
* dump.c (dump_access): Delete prototype.
(dump_op): Delete.
(cp_dump_tree): Don't call it.
* lambda.c (lambda_function): Use call_op_identifier.
(maybe_add_lambda_conv_op): Not an overloaded operator.  Remove
unneeded braces.
* mangle.c (write_unqualified_name): Use DECL_OVERLOADED_OPERTOR_CODE.
* method.c (do_build_copy_assign): Use assign_op_identifier.
(synthesize_method): Use DECL_OVERLOADED_OPERATOR_IS.
(get_copy_assign): Use assign_op_identifier.
(synthesized_method_walk): Likewise.
(defaultable_fn_check): Use DECL_OVERLOADED_OPERATOR_IS.
* parser.c (cp_parser_lambda_declarator_opt): Use
call_op_identifier.
* semanitics.c (classtype_has_nothrow_assign_or_copy_p): Use
assign_op_identifier.
* tree.c (special_function_p):  Use DECL_OVERLOADED_OPERATOR_IS.
* typeck.c (check_return_expr): Use DECL_OVERLOADED_OPERATOR_CODE.
(check_return_expr): Use assign_op_identifier.

From-SVN: r254263

14 files changed:
gcc/cp/ChangeLog
gcc/cp/call.c
gcc/cp/class.c
gcc/cp/cp-tree.h
gcc/cp/decl.c
gcc/cp/decl2.c
gcc/cp/dump.c
gcc/cp/lambda.c
gcc/cp/mangle.c
gcc/cp/method.c
gcc/cp/parser.c
gcc/cp/semantics.c
gcc/cp/tree.c
gcc/cp/typeck.c

index f1809f50e942cae4663d37c874c5c09a04a121d6..7ab9cf30065c136b49fe1049f1e7517a707cb8b0 100644 (file)
@@ -1,3 +1,43 @@
+2017-10-31  Nathan Sidwell  <nathan@acm.org>
+
+       * cp-tree.h (assign_op_identifier, call_op_identifier): Define.
+       (LAMBDA_FUNCTION_P): Use DECL_OVERLOADED_OPERATOR_IS.
+       (DECL_OVERLOADED_OPERATOR_P): Just retuurn true/false.
+       (DECL_OVERLOADED_OPERATOR_CODE, DECL_OVERLOADED_OPERATOR_IS): Define.
+       * call.c (add_function_candidate): Use
+       DECL_OVERLOADED_OPERATOR_IS.
+       (build_op_call_1): Use call_op_identifier &
+       DECL_OVERLOADED_OPERATOR_IS.
+       (build_over_call): Likewise.
+       (has_trivial_copy_assign_p): Use assign_op_identifier.
+       (build_special_member_call): Likewise.
+       * class.c (dfs_declare_virt_assop_and_dtor): Likewise.
+       (vbase_has_user_provided_move_assign,
+       classtype_has_move_assign_or_move_ctor_p): Likewise.
+       * decl.c (duplicate_decls): Use DECL_OVERLOADED_OPERATOR_CODE.
+       (grok_special_member_properties): Use assign_op_identifier.
+       (start_preparsed_function): Use DECL_OVERLOADED_OPERATOR_IS.
+       * decl2.c (mark_used): Use DECL_CONV_FN_P.
+       * dump.c (dump_access): Delete prototype.
+       (dump_op): Delete.
+       (cp_dump_tree): Don't call it.
+       * lambda.c (lambda_function): Use call_op_identifier.
+       (maybe_add_lambda_conv_op): Not an overloaded operator.  Remove
+       unneeded braces.
+       * mangle.c (write_unqualified_name): Use DECL_OVERLOADED_OPERTOR_CODE.
+       * method.c (do_build_copy_assign): Use assign_op_identifier.
+       (synthesize_method): Use DECL_OVERLOADED_OPERATOR_IS.
+       (get_copy_assign): Use assign_op_identifier.
+       (synthesized_method_walk): Likewise.
+       (defaultable_fn_check): Use DECL_OVERLOADED_OPERATOR_IS.
+       * parser.c (cp_parser_lambda_declarator_opt): Use
+       call_op_identifier.
+       * semanitics.c (classtype_has_nothrow_assign_or_copy_p): Use
+       assign_op_identifier.
+       * tree.c (special_function_p):  Use DECL_OVERLOADED_OPERATOR_IS.
+       * typeck.c (check_return_expr): Use DECL_OVERLOADED_OPERATOR_CODE.
+       (check_return_expr): Use assign_op_identifier.
+
 2017-10-30  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/82085
index de3434b3deaf95f5b102761d6cff8dae14718a20..d899d45ec6dbc1c48a5dd1a9d28126efe9288c6b 100644 (file)
@@ -2082,7 +2082,7 @@ add_function_candidate (struct z_candidate **candidates,
       if (DECL_CONSTRUCTOR_P (fn))
        i = 1;
       else if (DECL_ASSIGNMENT_OPERATOR_P (fn)
-              && DECL_OVERLOADED_OPERATOR_P (fn) == NOP_EXPR)
+              && DECL_OVERLOADED_OPERATOR_IS (fn, NOP_EXPR))
        i = 2;
       else
        i = 0;
@@ -4474,7 +4474,7 @@ build_op_call_1 (tree obj, vec<tree, va_gc> **args, tsubst_flags_t complain)
 
   if (TYPE_BINFO (type))
     {
-      fns = lookup_fnfields (TYPE_BINFO (type), cp_operator_id (CALL_EXPR), 1);
+      fns = lookup_fnfields (TYPE_BINFO (type), call_op_identifier, 1);
       if (fns == error_mark_node)
        return error_mark_node;
     }
@@ -4557,11 +4557,9 @@ build_op_call_1 (tree obj, vec<tree, va_gc> **args, tsubst_flags_t complain)
             }
          result = error_mark_node;
        }
-      /* Since cand->fn will be a type, not a function, for a conversion
-        function, we must be careful not to unconditionally look at
-        DECL_NAME here.  */
       else if (TREE_CODE (cand->fn) == FUNCTION_DECL
-              && DECL_OVERLOADED_OPERATOR_P (cand->fn) == CALL_EXPR)
+              && DECL_OVERLOADED_OPERATOR_P (cand->fn)
+              && DECL_OVERLOADED_OPERATOR_IS (cand->fn, CALL_EXPR))
        result = build_over_call (cand, LOOKUP_NORMAL, complain);
       else
        {
@@ -8116,7 +8114,8 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain)
          return val;
        }
     }
-  else if (DECL_OVERLOADED_OPERATOR_P (fn) == NOP_EXPR
+  else if (DECL_ASSIGNMENT_OPERATOR_P (fn)
+          && DECL_OVERLOADED_OPERATOR_IS (fn, NOP_EXPR)
           && trivial_fn_p (fn)
           && !DECL_DELETED_FN (fn))
     {
@@ -8284,7 +8283,7 @@ first_non_public_field (tree type)
 static bool
 has_trivial_copy_assign_p (tree type, bool access, bool *hasassign)
 {
-  tree fns = get_class_binding (type, cp_assignment_operator_id (NOP_EXPR));
+  tree fns = get_class_binding (type, assign_op_identifier);
   bool all_trivial = true;
 
   /* Iterate over overloads of the assignment operator, checking
@@ -8784,8 +8783,7 @@ build_special_member_call (tree instance, tree name, vec<tree, va_gc> **args,
   vec<tree, va_gc> *allocated = NULL;
   tree ret;
 
-  gcc_assert (IDENTIFIER_CDTOR_P (name)
-             || name == cp_assignment_operator_id (NOP_EXPR));
+  gcc_assert (IDENTIFIER_CDTOR_P (name) || name == assign_op_identifier);
   if (TYPE_P (binfo))
     {
       /* Resolve the name.  */
@@ -8811,7 +8809,7 @@ build_special_member_call (tree instance, tree name, vec<tree, va_gc> **args,
       if (!same_type_ignoring_top_level_qualifiers_p
          (TREE_TYPE (instance), BINFO_TYPE (binfo)))
        {
-         if (name != cp_assignment_operator_id (NOP_EXPR))
+         if (IDENTIFIER_CDTOR_P (name))
            /* For constructors and destructors, either the base is
               non-virtual, or it is virtual but we are doing the
               conversion from a constructor or destructor for the
@@ -8819,10 +8817,13 @@ build_special_member_call (tree instance, tree name, vec<tree, va_gc> **args,
               statically.  */
            instance = convert_to_base_statically (instance, binfo);
          else
-           /* However, for assignment operators, we must convert
-              dynamically if the base is virtual.  */
-           instance = build_base_path (PLUS_EXPR, instance,
-                                       binfo, /*nonnull=*/1, complain);
+           {
+             /* However, for assignment operators, we must convert
+                dynamically if the base is virtual.  */
+             gcc_checking_assert (name == assign_op_identifier);
+             instance = build_base_path (PLUS_EXPR, instance,
+                                         binfo, /*nonnull=*/1, complain);
+           }
        }
     }
 
index 9ef50657caebdcb246421564457aa41a7a75ff8e..96009df8a468e49ffbf6c989dd1a2c48f218602b 100644 (file)
@@ -3011,7 +3011,7 @@ static tree
 dfs_declare_virt_assop_and_dtor (tree binfo, void *data)
 {
   tree bv, fn, t = (tree)data;
-  tree opname = cp_assignment_operator_id (NOP_EXPR);
+  tree opname = assign_op_identifier;
 
   gcc_assert (t && CLASS_TYPE_P (t));
   gcc_assert (binfo && TREE_CODE (binfo) == TREE_BINFO);
@@ -5038,7 +5038,7 @@ vbase_has_user_provided_move_assign (tree type)
   /* Does the type itself have a user-provided move assignment operator?  */
   if (!CLASSTYPE_LAZY_MOVE_ASSIGN (type))
     for (ovl_iterator iter (get_class_binding_direct
-                           (type, cp_assignment_operator_id (NOP_EXPR)));
+                           (type, assign_op_identifier));
         iter; ++iter)
       if (!DECL_ARTIFICIAL (*iter) && move_fn_p (*iter))
        return true;
@@ -5186,7 +5186,7 @@ classtype_has_move_assign_or_move_ctor_p (tree t, bool user_p)
 
   if (!CLASSTYPE_LAZY_MOVE_ASSIGN (t))
     for (ovl_iterator iter (get_class_binding_direct
-                           (t, cp_assignment_operator_id (NOP_EXPR)));
+                           (t, assign_op_identifier));
         iter; ++iter)
       if ((!user_p || !DECL_ARTIFICIAL (*iter)) && move_fn_p (*iter))
        return true;
index 3aefd7e40f46de72e443a3a751551b49c19c9470..9c183a7e17305c42217ae4ad6475a1255654eb77 100644 (file)
@@ -217,7 +217,7 @@ extern GTY(()) tree cp_global_trees[CPTI_MAX];
    things) to iterate over their overloads defined by/for a type.  For
    example:
 
-     tree ovlid = cp_assignment_operator_id (NOP_EXPR);
+     tree ovlid = assign_op_identifier;
      tree overloads = get_class_binding (type, ovlid);
      for (ovl_iterator it (overloads); it; ++it) { ... }
 
@@ -244,6 +244,9 @@ extern GTY(()) tree cp_global_trees[CPTI_MAX];
 /* The name of a destructor that destroys virtual base classes, and
    then deletes the entire object.  */
 #define deleting_dtor_identifier       cp_global_trees[CPTI_DELETING_DTOR_IDENTIFIER]
+
+#define assign_op_identifier (cp_assignment_operator_id (NOP_EXPR))
+#define call_op_identifier (cp_operator_id (CALL_EXPR))
 /* The name used for conversion operators -- but note that actual
    conversion functions use special identifiers outside the identifier
    table.  */
@@ -1203,9 +1206,10 @@ struct GTY (()) tree_trait_expr {
   (CLASS_TYPE_P (NODE) && CLASSTYPE_LAMBDA_EXPR (NODE))
 
 /* Test if FUNCTION_DECL is a lambda function.  */
-#define LAMBDA_FUNCTION_P(FNDECL)                      \
-  (DECL_DECLARES_FUNCTION_P (FNDECL)                   \
-   && DECL_OVERLOADED_OPERATOR_P (FNDECL) == CALL_EXPR \
+#define LAMBDA_FUNCTION_P(FNDECL)                              \
+  (DECL_DECLARES_FUNCTION_P (FNDECL)                           \
+   && DECL_OVERLOADED_OPERATOR_P (FNDECL)                      \
+   && DECL_OVERLOADED_OPERATOR_IS (FNDECL, CALL_EXPR)          \
    && LAMBDA_TYPE_P (CP_DECL_CONTEXT (FNDECL)))
 
 enum cp_lambda_default_capture_mode_type {
@@ -2810,19 +2814,24 @@ struct GTY(()) lang_decl {
 #define SET_OVERLOADED_OPERATOR_CODE(NODE, CODE) \
   (LANG_DECL_FN_CHECK (NODE)->operator_code = (CODE))
 
-/* If NODE is an overloaded operator, then this returns the TREE_CODE
-   associated with the overloaded operator.  If NODE is not an
-   overloaded operator, ERROR_MARK is returned.  Since the numerical
-   value of ERROR_MARK is zero, this macro can be used as a predicate
-   to test whether or not NODE is an overloaded operator.  */
+/* True iff decl NODE is for an overloaded operator.  */
 #define DECL_OVERLOADED_OPERATOR_P(NODE)               \
-  (IDENTIFIER_ANY_OP_P (DECL_NAME (NODE))              \
-   ? LANG_DECL_FN_CHECK (NODE)->operator_code : ERROR_MARK)
+  IDENTIFIER_ANY_OP_P (DECL_NAME (NODE))
 
 /* Nonzero if NODE is an assignment operator (including += and such).  */
-#define DECL_ASSIGNMENT_OPERATOR_P(NODE) \
+#define DECL_ASSIGNMENT_OPERATOR_P(NODE)                \
   IDENTIFIER_ASSIGN_OP_P (DECL_NAME (NODE))
 
+/* NODE is a function_decl for an overloaded operator.  Return its
+   operator code.   */
+#define DECL_OVERLOADED_OPERATOR_CODE(NODE)                    \
+  (LANG_DECL_FN_CHECK (NODE)->operator_code)
+
+/* DECL is an overloaded operator.  Test whether it is for TREE_CODE
+   (a literal constant).  */
+#define DECL_OVERLOADED_OPERATOR_IS(DECL, CODE)                        \
+  (DECL_OVERLOADED_OPERATOR_CODE (DECL) == CODE)
+
 /* For FUNCTION_DECLs: nonzero means that this function is a
    constructor or a destructor with an extra in-charge parameter to
    control whether or not virtual bases are constructed.  */
index 0e49e2b6088550f692422fc8f1a47d77e262cb6e..a983adfe0c46e341a6a35c679cae2822efe232b2 100644 (file)
@@ -1921,9 +1921,9 @@ next_arg:;
       DECL_FINAL_P (newdecl) |= DECL_FINAL_P (olddecl);
       DECL_OVERRIDE_P (newdecl) |= DECL_OVERRIDE_P (olddecl);
       DECL_THIS_STATIC (newdecl) |= DECL_THIS_STATIC (olddecl);
-      if (DECL_OVERLOADED_OPERATOR_P (olddecl) != ERROR_MARK)
+      if (DECL_OVERLOADED_OPERATOR_P (olddecl))
        SET_OVERLOADED_OPERATOR_CODE
-         (newdecl, DECL_OVERLOADED_OPERATOR_P (olddecl));
+         (newdecl, DECL_OVERLOADED_OPERATOR_CODE (olddecl));
       new_defines_function = DECL_INITIAL (newdecl) != NULL_TREE;
 
       /* Optionally warn about more than one declaration for the same
@@ -12816,7 +12816,7 @@ grok_special_member_properties (tree decl)
          && !ctor && !move_fn_p (decl))
        TYPE_HAS_CONSTEXPR_CTOR (class_type) = 1;
     }
-  else if (DECL_NAME (decl) == cp_assignment_operator_id (NOP_EXPR))
+  else if (DECL_NAME (decl) == assign_op_identifier)
     {
       /* [class.copy]
 
@@ -14769,9 +14769,11 @@ start_preparsed_function (tree decl1, tree attrs, int flags)
 
   /* Effective C++ rule 15.  */
   if (warn_ecpp
-      && DECL_OVERLOADED_OPERATOR_P (decl1) == NOP_EXPR
+      && DECL_ASSIGNMENT_OPERATOR_P (decl1)
+      && DECL_OVERLOADED_OPERATOR_IS (decl1, NOP_EXPR)
       && VOID_TYPE_P (TREE_TYPE (fntype)))
-    warning (OPT_Weffc__, "%<operator=%> should return a reference to %<*this%>");
+    warning (OPT_Weffc__,
+            "%<operator=%> should return a reference to %<*this%>");
 
   /* Make the init_value nonzero so pushdecl knows this is not tentative.
      error_mark_node is replaced below (in poplevel) with the BLOCK.  */
index bc509623b36508317567449b60a0b68d79585391..80358651b03b7c9ef82be71579b9d2a6b01ab265 100644 (file)
@@ -5101,11 +5101,11 @@ mark_used (tree decl, tsubst_flags_t complain)
       && DECL_DELETED_FN (decl))
     {
       if (DECL_ARTIFICIAL (decl)
-         && DECL_OVERLOADED_OPERATOR_P (decl) == TYPE_EXPR
+         && DECL_CONV_FN_P (decl)
          && LAMBDA_TYPE_P (DECL_CONTEXT (decl)))
        /* We mark a lambda conversion op as deleted if we can't
           generate it properly; see maybe_add_lambda_conv_op.  */
-       sorry ("converting lambda which uses %<...%> to function pointer");
+       sorry ("converting lambda that uses %<...%> to function pointer");
       else if (complain & tf_error)
        {
          error ("use of deleted function %qD", decl);
index 6fafa5b792ec8cef5bebba95062025d50c35f98c..2e4740f71eb690cd02df94e4136753cba56b2b50 100644 (file)
@@ -24,10 +24,6 @@ along with GCC; see the file COPYING3.  If not see
 #include "cp-tree.h"
 #include "tree-dump.h"
 
-static void dump_access (dump_info_p, tree);
-
-static void dump_op (dump_info_p, tree);
-
 /* Dump a representation of the accessibility information associated
    with T.  */
 
@@ -42,163 +38,6 @@ dump_access (dump_info_p di, tree t)
     dump_string_field (di, "accs", "pub");
 }
 
-/* Dump a representation of the specific operator for an overloaded
-   operator associated with node t.  */
-
-static void
-dump_op (dump_info_p di, tree t)
-{
-  switch (DECL_OVERLOADED_OPERATOR_P (t)) {
-    case NEW_EXPR:
-      dump_string (di, "new");
-      break;
-    case VEC_NEW_EXPR:
-      dump_string (di, "vecnew");
-      break;
-    case DELETE_EXPR:
-      dump_string (di, "delete");
-      break;
-    case VEC_DELETE_EXPR:
-      dump_string (di, "vecdelete");
-      break;
-    case UNARY_PLUS_EXPR:
-      dump_string (di, "pos");
-      break;
-    case NEGATE_EXPR:
-      dump_string (di, "neg");
-      break;
-    case ADDR_EXPR:
-      dump_string (di, "addr");
-      break;
-    case INDIRECT_REF:
-      dump_string(di, "deref");
-      break;
-    case BIT_NOT_EXPR:
-      dump_string(di, "not");
-      break;
-    case TRUTH_NOT_EXPR:
-      dump_string(di, "lnot");
-      break;
-    case PREINCREMENT_EXPR:
-      dump_string(di, "preinc");
-      break;
-    case PREDECREMENT_EXPR:
-      dump_string(di, "predec");
-      break;
-    case PLUS_EXPR:
-      if (DECL_ASSIGNMENT_OPERATOR_P (t))
-       dump_string (di, "plusassign");
-      else
-       dump_string(di, "plus");
-      break;
-    case MINUS_EXPR:
-      if (DECL_ASSIGNMENT_OPERATOR_P (t))
-       dump_string (di, "minusassign");
-      else
-       dump_string(di, "minus");
-      break;
-    case MULT_EXPR:
-      if (DECL_ASSIGNMENT_OPERATOR_P (t))
-       dump_string (di, "multassign");
-      else
-       dump_string (di, "mult");
-      break;
-    case TRUNC_DIV_EXPR:
-      if (DECL_ASSIGNMENT_OPERATOR_P (t))
-       dump_string (di, "divassign");
-      else
-       dump_string (di, "div");
-      break;
-    case TRUNC_MOD_EXPR:
-      if (DECL_ASSIGNMENT_OPERATOR_P (t))
-        dump_string (di, "modassign");
-      else
-       dump_string (di, "mod");
-      break;
-    case BIT_AND_EXPR:
-      if (DECL_ASSIGNMENT_OPERATOR_P (t))
-       dump_string (di, "andassign");
-      else
-       dump_string (di, "and");
-      break;
-    case BIT_IOR_EXPR:
-      if (DECL_ASSIGNMENT_OPERATOR_P (t))
-       dump_string (di, "orassign");
-      else
-       dump_string (di, "or");
-      break;
-    case BIT_XOR_EXPR:
-      if (DECL_ASSIGNMENT_OPERATOR_P (t))
-       dump_string (di, "xorassign");
-      else
-       dump_string (di, "xor");
-      break;
-    case LSHIFT_EXPR:
-      if (DECL_ASSIGNMENT_OPERATOR_P (t))
-       dump_string (di, "lshiftassign");
-      else
-       dump_string (di, "lshift");
-      break;
-    case RSHIFT_EXPR:
-      if (DECL_ASSIGNMENT_OPERATOR_P (t))
-       dump_string (di, "rshiftassign");
-      else
-       dump_string (di, "rshift");
-      break;
-    case EQ_EXPR:
-      dump_string (di, "eq");
-      break;
-    case NE_EXPR:
-      dump_string (di, "ne");
-      break;
-    case LT_EXPR:
-      dump_string (di, "lt");
-      break;
-    case GT_EXPR:
-      dump_string (di, "gt");
-      break;
-    case LE_EXPR:
-      dump_string (di, "le");
-      break;
-    case GE_EXPR:
-      dump_string (di, "ge");
-      break;
-    case TRUTH_ANDIF_EXPR:
-      dump_string (di, "land");
-      break;
-    case TRUTH_ORIF_EXPR:
-      dump_string (di, "lor");
-      break;
-    case COMPOUND_EXPR:
-      dump_string (di, "compound");
-      break;
-    case MEMBER_REF:
-      dump_string (di, "memref");
-      break;
-    case COMPONENT_REF:
-      dump_string (di, "ref");
-      break;
-    case ARRAY_REF:
-      dump_string (di, "subs");
-      break;
-    case POSTINCREMENT_EXPR:
-      dump_string (di, "postinc");
-      break;
-    case POSTDECREMENT_EXPR:
-      dump_string (di, "postdec");
-      break;
-    case CALL_EXPR:
-      dump_string (di, "call");
-      break;
-    case NOP_EXPR:
-      if (DECL_ASSIGNMENT_OPERATOR_P (t))
-       dump_string (di, "assign");
-      break;
-    default:
-      break;
-  }
-}
-
 /* Dump information common to statements from STMT.  */
 
 static void
@@ -303,10 +142,8 @@ cp_dump_tree (void* dump_info, tree t)
     case FUNCTION_DECL:
       if (!DECL_THUNK_P (t))
        {
-         if (DECL_OVERLOADED_OPERATOR_P (t)) {
+         if (DECL_OVERLOADED_OPERATOR_P (t))
            dump_string_field (di, "note", "operator");
-           dump_op (di, t);
-         }
          if (DECL_FUNCTION_MEMBER_P (t))
            {
              dump_string_field (di, "note", "member");
index 76f2f29578fe14b9ec1e291ead7d0fd80e50b917..bb6c68a100a078c8715c0067860cc201d8adfccb 100644 (file)
@@ -201,7 +201,7 @@ lambda_function (tree lambda)
   if (CLASSTYPE_TEMPLATE_INSTANTIATION (type)
       && !COMPLETE_OR_OPEN_TYPE_P (type))
     return NULL_TREE;
-  lambda = lookup_member (type, cp_operator_id (CALL_EXPR),
+  lambda = lookup_member (type, call_op_identifier,
                          /*protect=*/0, /*want_type=*/false,
                          tf_warning_or_error);
   if (lambda)
@@ -1258,7 +1258,6 @@ maybe_add_lambda_conv_op (tree type)
   tree fn = convfn;
   DECL_SOURCE_LOCATION (fn) = DECL_SOURCE_LOCATION (callop);
   SET_DECL_ALIGN (fn, MINIMUM_METHOD_BOUNDARY);
-  SET_OVERLOADED_OPERATOR_CODE (fn, TYPE_EXPR);
   grokclassfn (type, fn, NO_SPECIAL);
   set_linkage_according_to_type (type, fn);
   rest_of_decl_compilation (fn, namespace_bindings_p (), at_eof);
@@ -1312,11 +1311,9 @@ maybe_add_lambda_conv_op (tree type)
     fn = add_inherited_template_parms (fn, DECL_TI_TEMPLATE (callop));
 
   if (flag_sanitize & SANITIZE_NULL)
-    {
-      /* Don't UBsan this function; we're deliberately calling op() with a null
-        object argument.  */
-      add_no_sanitize_value (fn, SANITIZE_UNDEFINED);
-    }
+    /* Don't UBsan this function; we're deliberately calling op() with a null
+       object argument.  */
+    add_no_sanitize_value (fn, SANITIZE_UNDEFINED);
 
   add_method (type, fn, false);
 
index 64397cdddcb63b163f1206df49a5d57cc52ad2a2..d01e652d4a075487aa441286a249271b6c357602 100644 (file)
@@ -1351,7 +1351,7 @@ write_unqualified_name (tree decl)
          else
            oni = operator_name_info;
 
-         write_string (oni[DECL_OVERLOADED_OPERATOR_P (decl)].mangled_name);
+         write_string (oni[DECL_OVERLOADED_OPERATOR_CODE (decl)].mangled_name);
        }
       else if (UDLIT_OPER_P (DECL_NAME (decl)))
        write_literal_operator_name (DECL_NAME (decl));
index 4e56874ae26e2e400ee6e460b4c5fa73d997cac3..e88e508892db12f494ce52d4b8e18bc654202c5c 100644 (file)
@@ -815,7 +815,7 @@ do_build_copy_assign (tree fndecl)
          parmvec = make_tree_vector_single (converted_parm);
          finish_expr_stmt
            (build_special_member_call (current_class_ref,
-                                       cp_assignment_operator_id (NOP_EXPR),
+                                       assign_op_identifier,
                                        &parmvec,
                                        base_binfo,
                                        flags,
@@ -929,7 +929,8 @@ synthesize_method (tree fndecl)
   start_preparsed_function (fndecl, NULL_TREE, SF_DEFAULT | SF_PRE_PARSED);
   stmt = begin_function_body ();
 
-  if (DECL_OVERLOADED_OPERATOR_P (fndecl) == NOP_EXPR)
+  if (DECL_ASSIGNMENT_OPERATOR_P (fndecl)
+      && DECL_OVERLOADED_OPERATOR_IS (fndecl, NOP_EXPR))
     {
       do_build_copy_assign (fndecl);
       need_body = false;
@@ -1108,7 +1109,7 @@ get_copy_assign (tree type)
   int quals = (TYPE_HAS_CONST_COPY_ASSIGN (type)
               ? TYPE_QUAL_CONST : TYPE_UNQUALIFIED);
   tree argtype = build_stub_type (type, quals, false);
-  tree fn = locate_fn_flags (type, cp_assignment_operator_id (NOP_EXPR), argtype,
+  tree fn = locate_fn_flags (type, assign_op_identifier, argtype,
                             LOOKUP_NORMAL, tf_warning_or_error);
   if (fn == error_mark_node)
     return NULL_TREE;
@@ -1565,7 +1566,7 @@ synthesized_method_walk (tree ctype, special_function_kind sfk, bool const_p,
     case sfk_move_assignment:
     case sfk_copy_assignment:
       assign_p = true;
-      fnname = cp_assignment_operator_id (NOP_EXPR);
+      fnname = assign_op_identifier;
       break;
 
     case sfk_destructor:
@@ -2318,7 +2319,7 @@ defaultable_fn_check (tree fn)
   else if (DECL_DESTRUCTOR_P (fn))
     kind = sfk_destructor;
   else if (DECL_ASSIGNMENT_OPERATOR_P (fn)
-          && DECL_OVERLOADED_OPERATOR_P (fn) == NOP_EXPR)
+          && DECL_OVERLOADED_OPERATOR_IS (fn, NOP_EXPR))
     {
       if (copy_fn_p (fn))
        kind = sfk_copy_assignment;
index c31cd64c026d3e4708c08e6c49927b013aa130ba..a536b808c3ca97a9c4168ff0406cc1c390dc129d 100644 (file)
@@ -10614,8 +10614,7 @@ cp_parser_lambda_declarator_opt (cp_parser* parser, tree lambda_expr)
 
     p = obstack_alloc (&declarator_obstack, 0);
 
-    declarator = make_id_declarator (NULL_TREE, cp_operator_id (CALL_EXPR),
-                                    sfk_none);
+    declarator = make_id_declarator (NULL_TREE, call_op_identifier, sfk_none);
 
     quals = (LAMBDA_EXPR_MUTABLE_P (lambda_expr)
             ? TYPE_UNQUALIFIED : TYPE_QUAL_CONST);
index 71318b924b8650b19c361794d6494bc5503d42d9..89bea1e1f54b6c1b62fadfcfec2d96276a6be306 100644 (file)
@@ -9020,8 +9020,7 @@ classtype_has_nothrow_assign_or_copy_p (tree type, bool assign_p)
   tree fns = NULL_TREE;
 
   if (assign_p || TYPE_HAS_COPY_CTOR (type))
-    fns = get_class_binding (type,
-                            assign_p ? cp_assignment_operator_id (NOP_EXPR)
+    fns = get_class_binding (type, assign_p ? assign_op_identifier
                             : ctor_identifier);
 
   bool saw_copy = false;
index 48d40945af397de533d039474d325a8152a6ead3..b7d5f3dc3f516d369258981ab2dce833219c3aee 100644 (file)
@@ -4847,7 +4847,8 @@ special_function_p (const_tree decl)
     return sfk_move_constructor;
   if (DECL_CONSTRUCTOR_P (decl))
     return sfk_constructor;
-  if (DECL_OVERLOADED_OPERATOR_P (decl) == NOP_EXPR)
+  if (DECL_ASSIGNMENT_OPERATOR_P (decl)
+      && DECL_OVERLOADED_OPERATOR_IS (decl, NOP_EXPR))
     {
       if (copy_fn_p (decl))
        return sfk_copy_assignment;
index a7dc418a0d158e3f095311686af72f33622b8bec..3cc746a5ba478f861d3446fa8787de363172b7f1 100644 (file)
@@ -9073,8 +9073,10 @@ check_return_expr (tree retval, bool *no_warning)
     }
 
   /* Only operator new(...) throw(), can return NULL [expr.new/13].  */
-  if ((DECL_OVERLOADED_OPERATOR_P (current_function_decl) == NEW_EXPR
-       || DECL_OVERLOADED_OPERATOR_P (current_function_decl) == VEC_NEW_EXPR)
+  if (DECL_OVERLOADED_OPERATOR_P (current_function_decl)
+      && (DECL_OVERLOADED_OPERATOR_CODE (current_function_decl) == NEW_EXPR
+         || (DECL_OVERLOADED_OPERATOR_CODE (current_function_decl)
+             == VEC_NEW_EXPR))
       && !TYPE_NOTHROW_P (TREE_TYPE (current_function_decl))
       && ! flag_check_new
       && retval && null_ptr_cst_p (retval))
@@ -9083,7 +9085,7 @@ check_return_expr (tree retval, bool *no_warning)
 
   /* Effective C++ rule 15.  See also start_function.  */
   if (warn_ecpp
-      && DECL_NAME (current_function_decl) == cp_assignment_operator_id (NOP_EXPR))
+      && DECL_NAME (current_function_decl) == assign_op_identifier)
     {
       bool warn = true;