]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: P0847R7 (deducing this) - prerequisite changes. [PR102609]
authorwaffl3x <waffl3x@protonmail.com>
Sun, 7 Jan 2024 00:00:10 +0000 (00:00 +0000)
committerJason Merrill <jason@redhat.com>
Tue, 9 Jan 2024 20:59:04 +0000 (15:59 -0500)
Adds the xobj_flag member to lang_decl_fn and a corresponding member access
macro and predicate to support the addition of explicit object member
functions. Additionally, since explicit object member functions are also
non-static member functions, we need to change uses of
DECL_NONSTATIC_MEMBER_FUNCTION_P to clarify whether they intend to include
or exclude them.

PR c++/102609

gcc/cp/ChangeLog:

* cp-tree.h (struct lang_decl_fn): New data member.
(DECL_NONSTATIC_MEMBER_FUNCTION_P): Poison.
(DECL_IOBJ_MEMBER_FUNCTION_P): Define.
(DECL_FUNCTION_XOBJ_FLAG): Define.
(DECL_XOBJ_MEMBER_FUNCTION_P): Define.
(DECL_OBJECT_MEMBER_FUNCTION_P): Define.
(DECL_FUNCTION_MEMBER_P): Don't use
DECL_NONSTATIC_MEMBER_FUNCTION_P.
(DECL_CONST_MEMFUNC_P): Likewise.
(DECL_VOLATILE_MEMFUNC_P): Likewise.
(DECL_NONSTATIC_MEMBER_P): Likewise.
* module.cc (trees_out::lang_decl_bools): Handle xobj_flag.
(trees_in::lang_decl_bools): Handle xobj_flag.
* call.cc (build_this_conversion)
(add_function_candidate)
(add_template_candidate_real)
(add_candidates)
(maybe_warn_class_memaccess)
(cand_parms_match)
(joust)
(do_warn_dangling_reference)
* class.cc (finalize_literal_type_property)
(finish_struct)
(resolve_address_of_overloaded_function)
* constexpr.cc (is_valid_constexpr_fn)
(cxx_bind_parameters_in_call)
* contracts.cc (build_contract_condition_function)
* cp-objcp-common.cc (cp_decl_dwarf_attribute)
* cxx-pretty-print.cc (cxx_pretty_printer::postfix_expression)
(cxx_pretty_printer::declaration_specifiers)
(cxx_pretty_printer::direct_declarator)
* decl.cc (cp_finish_decl)
(grok_special_member_properties)
(start_preparsed_function)
(record_key_method_defined)
* decl2.cc (cp_handle_deprecated_or_unavailable)
* init.cc (find_uninit_fields_r)
(build_offset_ref)
* lambda.cc (lambda_expr_this_capture)
(maybe_generic_this_capture)
(nonlambda_method_basetype)
* mangle.cc (write_nested_name)
* method.cc (early_check_defaulted_comparison)
(skip_artificial_parms_for)
(num_artificial_parms_for)
* pt.cc (is_specialization_of_friend)
(determine_specialization)
(copy_default_args_to_explicit_spec)
(check_explicit_specialization)
(tsubst_contract_attribute)
(check_non_deducible_conversions)
(more_specialized_fn)
(maybe_instantiate_noexcept)
(register_parameter_specializations)
(value_dependent_expression_p)
* search.cc (shared_member_p)
(lookup_member)
(field_access_p)
* semantics.cc (finish_omp_declare_simd_methods)
* tree.cc (lvalue_kind)
* typeck.cc (invalid_nonstatic_memfn_p): Don't use
DECL_NONSTATIC_MEMBER_FUNCTION_P.

libcc1/ChangeLog:

* libcp1plugin.cc (plugin_pragma_push_user_expression): Don't use
DECL_NONSTATIC_MEMBER_FUNCTION_P.

Signed-off-by: Waffl3x <waffl3x@protonmail.com>
Co-authored-by: Jason Merrill <jason@redhat.com>
20 files changed:
gcc/cp/call.cc
gcc/cp/class.cc
gcc/cp/constexpr.cc
gcc/cp/contracts.cc
gcc/cp/cp-objcp-common.cc
gcc/cp/cp-tree.h
gcc/cp/cxx-pretty-print.cc
gcc/cp/decl.cc
gcc/cp/decl2.cc
gcc/cp/init.cc
gcc/cp/lambda.cc
gcc/cp/mangle.cc
gcc/cp/method.cc
gcc/cp/module.cc
gcc/cp/pt.cc
gcc/cp/search.cc
gcc/cp/semantics.cc
gcc/cp/tree.cc
gcc/cp/typeck.cc
libcc1/libcp1plugin.cc

index 1c675726f8ca51c9de98383a5958fb3905cd6702..be89ff231bd591a0c046f54be6b79aa4ca3072e1 100644 (file)
@@ -2323,7 +2323,7 @@ build_this_conversion (tree fn, tree ctype,
                       tree& parmtype, tree& argtype, tree& arg,
                       int flags, tsubst_flags_t complain)
 {
-  gcc_assert (DECL_NONSTATIC_MEMBER_FUNCTION_P (fn)
+  gcc_assert (DECL_IOBJ_MEMBER_FUNCTION_P (fn)
              && !DECL_CONSTRUCTOR_P (fn));
 
   /* The type of the implicit object parameter ('this') for
@@ -2536,7 +2536,7 @@ add_function_candidate (struct z_candidate **candidates,
        {
          tree parmtype = TREE_VALUE (parmnode);
          if (i == 0
-             && DECL_NONSTATIC_MEMBER_FUNCTION_P (fn)
+             && DECL_IOBJ_MEMBER_FUNCTION_P (fn)
              && !DECL_CONSTRUCTOR_P (fn))
            t = build_this_conversion (fn, ctype, parmtype, argtype, arg,
                                       flags, complain);
@@ -3493,7 +3493,7 @@ add_template_candidate_real (struct z_candidate **candidates, tree tmpl,
 
   /* We don't do deduction on the in-charge parameter, the VTT
      parameter or 'this'.  */
-  if (DECL_NONSTATIC_MEMBER_FUNCTION_P (tmpl))
+  if (DECL_IOBJ_MEMBER_FUNCTION_P (tmpl))
     {
       if (first_arg_without_in_chrg != NULL_TREE)
        first_arg_without_in_chrg = NULL_TREE;
@@ -3603,7 +3603,7 @@ add_template_candidate_real (struct z_candidate **candidates, tree tmpl,
       convs = alloc_conversions (nargs);
 
       if (shortcut_bad_convs
-         && DECL_NONSTATIC_MEMBER_FUNCTION_P (tmpl)
+         && DECL_IOBJ_MEMBER_FUNCTION_P (tmpl)
          && !DECL_CONSTRUCTOR_P (tmpl))
        {
          /* Check the 'this' conversion before proceeding with deduction.
@@ -6631,7 +6631,7 @@ add_candidates (tree fns, tree first_arg, const vec<tree, va_gc> *args,
       tree fn_first_arg = NULL_TREE;
       const vec<tree, va_gc> *fn_args = args;
 
-      if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fn))
+      if (DECL_OBJECT_MEMBER_FUNCTION_P (fn))
        {
          /* Figure out where the object arg comes from.  If this
             function is a non-static member and we didn't get an
@@ -10798,7 +10798,8 @@ maybe_warn_class_memaccess (location_t loc, tree fndecl,
      type.  If so, and if the class has no non-trivial bases or members,
      be more permissive.  */
   if (current_function_decl
-      && DECL_NONSTATIC_MEMBER_FUNCTION_P (current_function_decl)
+      && DECL_OBJECT_MEMBER_FUNCTION_P (current_function_decl)
+      /* ??? is_object_parameter?  */
       && is_this_parameter (tree_strip_nop_conversions (dest)))
     {
       tree ctx = DECL_CONTEXT (current_function_decl);
@@ -12698,8 +12699,8 @@ cand_parms_match (z_candidate *c1, z_candidate *c2)
   tree parms2 = TYPE_ARG_TYPES (TREE_TYPE (fn2));
   if (DECL_FUNCTION_MEMBER_P (fn1)
       && DECL_FUNCTION_MEMBER_P (fn2)
-      && (DECL_NONSTATIC_MEMBER_FUNCTION_P (fn1)
-         != DECL_NONSTATIC_MEMBER_FUNCTION_P (fn2)))
+      && (DECL_STATIC_FUNCTION_P (fn1)
+         != DECL_STATIC_FUNCTION_P (fn2)))
     {
       /* Ignore 'this' when comparing the parameters of a static member
         function with those of a non-static one.  */
@@ -12884,7 +12885,7 @@ joust (struct z_candidate *cand1, struct z_candidate *cand2, bool warn,
                          print_z_candidate (input_location,
                                             N_("candidate 2:"), l);
                          if (w->fn == l->fn
-                             && DECL_NONSTATIC_MEMBER_FUNCTION_P (w->fn)
+                             && DECL_IOBJ_MEMBER_FUNCTION_P (w->fn)
                              && (type_memfn_quals (TREE_TYPE (w->fn))
                                  & TYPE_QUAL_CONST) == 0)
                            {
@@ -14033,7 +14034,7 @@ do_warn_dangling_reference (tree expr, bool arg_p)
               because R refers to one of the int elements of V, not to
               a temporary object.  Member operator* may return a reference
               but probably not to one of its arguments.  */
-           || (DECL_NONSTATIC_MEMBER_FUNCTION_P (fndecl)
+           || (DECL_OBJECT_MEMBER_FUNCTION_P (fndecl)
                && DECL_OVERLOADED_OPERATOR_P (fndecl)
                && DECL_OVERLOADED_OPERATOR_IS (fndecl, INDIRECT_REF)))
          return NULL_TREE;
@@ -14059,7 +14060,7 @@ do_warn_dangling_reference (tree expr, bool arg_p)
            tree arg = CALL_EXPR_ARG (expr, i);
            /* Check that this argument initializes a reference, except for
               the argument initializing the object of a member function.  */
-           if (!DECL_NONSTATIC_MEMBER_FUNCTION_P (fndecl)
+           if (!DECL_IOBJ_MEMBER_FUNCTION_P (fndecl)
                && !TYPE_REF_P (TREE_TYPE (arg)))
              continue;
            STRIP_NOPS (arg);
@@ -14079,7 +14080,7 @@ do_warn_dangling_reference (tree expr, bool arg_p)
               const S& s = S().self();
             where 's' dangles.  If we've gotten here, the object this function
             is invoked on is not a temporary.  */
-           if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fndecl))
+           if (DECL_OBJECT_MEMBER_FUNCTION_P (fndecl))
              break;
          }
        return NULL_TREE;
index a45c0d6ce46445e9d23c3e628fa4609d91721f2c..5bfdabecba59d5279a3e61e5f5081f0387aa4829 100644 (file)
@@ -5968,7 +5968,7 @@ finalize_literal_type_property (tree t)
     for (fn = TYPE_FIELDS (t); fn; fn = DECL_CHAIN (fn))
       if (TREE_CODE (fn) == FUNCTION_DECL
          && DECL_DECLARED_CONSTEXPR_P (fn)
-         && DECL_NONSTATIC_MEMBER_FUNCTION_P (fn)
+         && DECL_IOBJ_MEMBER_FUNCTION_P (fn)
          && !DECL_CONSTRUCTOR_P (fn))
        {
          DECL_DECLARED_CONSTEXPR_P (fn) = false;
@@ -7932,7 +7932,7 @@ finish_struct (tree t, tree attributes)
   if (flag_openmp)
     for (tree decl = TYPE_FIELDS (t); decl; decl = DECL_CHAIN (decl))
       if (TREE_CODE (decl) == FUNCTION_DECL
-         && DECL_NONSTATIC_MEMBER_FUNCTION_P (decl))
+         && DECL_OBJECT_MEMBER_FUNCTION_P (decl))
        if (tree attr = lookup_attribute ("omp declare variant base",
                                          DECL_ATTRIBUTES (decl)))
          omp_declare_variant_finalize (decl, attr);
@@ -8727,7 +8727,7 @@ resolve_address_of_overloaded_function (tree target_type,
   /* Good, exactly one match.  Now, convert it to the correct type.  */
   fn = TREE_PURPOSE (matches);
 
-  if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fn)
+  if (DECL_OBJECT_MEMBER_FUNCTION_P (fn)
       && !(complain & tf_ptrmem_ok) && !flag_ms_extensions)
     {
       static int explained;
index 37500b7ea7a5a4fa9785f104c1194d9ecfee2f2b..6350fe1540856ade686cec72bfa7cf1a61165d08 100644 (file)
@@ -291,7 +291,7 @@ is_valid_constexpr_fn (tree fun, bool complain)
 
       /* C++14 DR 1684 removed this restriction.  */
       if (cxx_dialect < cxx14
-         && DECL_NONSTATIC_MEMBER_FUNCTION_P (fun)
+         && DECL_IOBJ_MEMBER_FUNCTION_P (fun)
          && !CLASSTYPE_LITERAL_P (DECL_CONTEXT (fun)))
        {
          ret = false;
@@ -1886,7 +1886,7 @@ cxx_bind_parameters_in_call (const constexpr_ctx *ctx, tree t, tree fun,
                                          non_constant_p, overflow_p);
       /* Check we aren't dereferencing a null pointer when calling a non-static
         member function, which is undefined behaviour.  */
-      if (i == 0 && DECL_NONSTATIC_MEMBER_FUNCTION_P (fun)
+      if (i == 0 && DECL_OBJECT_MEMBER_FUNCTION_P (fun)
          && integer_zerop (arg)
          /* But ignore calls from within compiler-generated code, to handle
             cases like lambda function pointer conversion operator thunks
index 6c23f9db63a1c061ea60351dfbf227ca2d195dcf..634e3cf4fa9a9243721cf116dfc0bdcea45dd6f3 100644 (file)
@@ -1398,7 +1398,7 @@ build_contract_condition_function (tree fndecl, bool pre)
 {
   if (TREE_TYPE (fndecl) == error_mark_node)
     return error_mark_node;
-  if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fndecl)
+  if (DECL_IOBJ_MEMBER_FUNCTION_P (fndecl)
       && !TYPE_METHOD_BASETYPE (TREE_TYPE (fndecl)))
     return error_mark_node;
 
@@ -1421,7 +1421,7 @@ build_contract_condition_function (tree fndecl, bool pre)
       arg_type && arg_type != void_list_node;
       arg_type = TREE_CHAIN (arg_type))
     {
-      if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fndecl)
+      if (DECL_IOBJ_MEMBER_FUNCTION_P (fndecl)
          && TYPE_ARG_TYPES (TREE_TYPE (fn)) == arg_type)
       {
        class_type = TREE_TYPE (TREE_VALUE (arg_type));
@@ -1451,7 +1451,7 @@ build_contract_condition_function (tree fndecl, bool pre)
     }
 
   TREE_TYPE (fn) = build_function_type (value_type, arg_types);
-  if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fndecl))
+  if (DECL_IOBJ_MEMBER_FUNCTION_P (fndecl))
     TREE_TYPE (fn) = build_method_type (class_type, TREE_TYPE (fn));
 
   DECL_NAME (fn) = copy_node (DECL_NAME (fn));
index 2bec8e61cc07d7e8823904d2266b99aa52a2b2e9..f06edf04ef07d08c55542e582a107a670a82a5b1 100644 (file)
@@ -349,7 +349,7 @@ cp_decl_dwarf_attribute (const_tree decl, int attr)
 
     case DW_AT_reference:
       if (TREE_CODE (decl) == FUNCTION_DECL
-         && DECL_NONSTATIC_MEMBER_FUNCTION_P (decl)
+         && DECL_IOBJ_MEMBER_FUNCTION_P (decl)
          && FUNCTION_REF_QUALIFIED (TREE_TYPE (decl))
          && !FUNCTION_RVALUE_QUALIFIED (TREE_TYPE (decl)))
        return 1;
@@ -357,7 +357,7 @@ cp_decl_dwarf_attribute (const_tree decl, int attr)
 
     case DW_AT_rvalue_reference:
       if (TREE_CODE (decl) == FUNCTION_DECL
-         && DECL_NONSTATIC_MEMBER_FUNCTION_P (decl)
+         && DECL_IOBJ_MEMBER_FUNCTION_P (decl)
          && FUNCTION_REF_QUALIFIED (TREE_TYPE (decl))
          && FUNCTION_RVALUE_QUALIFIED (TREE_TYPE (decl)))
        return 1;
index 86084b5c350c813f6b3a2960597368452e906f66..f0bddb7e11da7209d502690fcc809d08906fc8cf 100644 (file)
@@ -2962,8 +2962,9 @@ struct GTY(()) lang_decl_fn {
   unsigned coroutine_p : 1;
   unsigned implicit_constexpr : 1;
   unsigned escalated_p : 1;
+  unsigned xobj_func : 1;
 
-  unsigned spare : 8;
+  unsigned spare : 7;
 
   /* 32-bits padding on 64-bit host.  */
 
@@ -3361,33 +3362,55 @@ struct GTY(()) lang_decl {
 #define DECL_STATIC_FUNCTION_P(NODE) \
   (LANG_DECL_FN_CHECK (NODE)->static_function)
 
-/* Nonzero for FUNCTION_DECL means that this decl is a non-static
+/* Nonzero for FUNCTION_DECL means that this decl is a non-static member
+   function.  C++23 explicit object member functions are also considered
+   non-static, but most former uses of this macro meant implicit object member
+   function.  Instead of this macro, use DECL_IOBJ_MEMBER_FUNCTION_P or
+   DECL_OBJECT_MEMBER_FUNCTION_P.  */
+#define DECL_NONSTATIC_MEMBER_FUNCTION_P(NODE) did_you_mean_object_or_iobj
+
+/* Nonzero for FUNCTION_DECL means that this decl is an implicit object
    member function.  */
-#define DECL_NONSTATIC_MEMBER_FUNCTION_P(NODE) \
+#define DECL_IOBJ_MEMBER_FUNCTION_P(NODE) \
   (TREE_CODE (TREE_TYPE (NODE)) == METHOD_TYPE)
 
+/* Simple member access, only valid for FUNCTION_DECL nodes.  */
+#define DECL_FUNCTION_XOBJ_FLAG(NODE)  \
+  (LANG_DECL_FN_CHECK (NODE)->xobj_func)
+
+/* Nonzero if NODE is an xobj member function,
+   safely evaluates to false for all non FUNCTION_DECL nodes.  */
+#define DECL_XOBJ_MEMBER_FUNCTION_P(NODE)              \
+  (TREE_CODE (STRIP_TEMPLATE (NODE)) == FUNCTION_DECL  \
+   && DECL_FUNCTION_XOBJ_FLAG (NODE) == 1)
+
+/* Nonzero if NODE is a member function with an object argument,
+   in other words, a non-static member function.  */
+#define DECL_OBJECT_MEMBER_FUNCTION_P(NODE) \
+  (DECL_IOBJ_MEMBER_FUNCTION_P (NODE) || DECL_XOBJ_MEMBER_FUNCTION_P (NODE))
+
 /* Nonzero for FUNCTION_DECL means that this decl is a member function
    (static or non-static).  */
 #define DECL_FUNCTION_MEMBER_P(NODE) \
-  (DECL_NONSTATIC_MEMBER_FUNCTION_P (NODE) || DECL_STATIC_FUNCTION_P (NODE))
+  (DECL_OBJECT_MEMBER_FUNCTION_P (NODE) || DECL_STATIC_FUNCTION_P (NODE)) \
 
 /* Nonzero for FUNCTION_DECL means that this member function
    has `this' as const X *const.  */
 #define DECL_CONST_MEMFUNC_P(NODE)                                      \
-  (DECL_NONSTATIC_MEMBER_FUNCTION_P (NODE)                              \
+  (DECL_IOBJ_MEMBER_FUNCTION_P (NODE)                           \
    && CP_TYPE_CONST_P (TREE_TYPE (TREE_VALUE                            \
                                  (TYPE_ARG_TYPES (TREE_TYPE (NODE))))))
 
 /* Nonzero for FUNCTION_DECL means that this member function
    has `this' as volatile X *const.  */
 #define DECL_VOLATILE_MEMFUNC_P(NODE)                                   \
-  (DECL_NONSTATIC_MEMBER_FUNCTION_P (NODE)                              \
+  (DECL_IOBJ_MEMBER_FUNCTION_P (NODE)                           \
    && CP_TYPE_VOLATILE_P (TREE_TYPE (TREE_VALUE                                 \
                                  (TYPE_ARG_TYPES (TREE_TYPE (NODE))))))
 
 /* Nonzero for a DECL means that this member is a non-static member.  */
 #define DECL_NONSTATIC_MEMBER_P(NODE)          \
-  (DECL_NONSTATIC_MEMBER_FUNCTION_P (NODE)     \
+  (DECL_OBJECT_MEMBER_FUNCTION_P (NODE)        \
    || TREE_CODE (NODE) == FIELD_DECL)
 
 /* Nonzero for a FIELD_DECL means that this member object type
index c7c4ae5f79f3a7de4dce647ebec7d10585d4125c..c6d8cc84132b83f2fe662e8bb56b41c8898813ef 100644 (file)
@@ -553,7 +553,7 @@ cxx_pretty_printer::postfix_expression (tree t)
           instantiation time.  */
        if (TREE_CODE (fun) != FUNCTION_DECL)
          ;
-       else if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fun))
+       else if (DECL_OBJECT_MEMBER_FUNCTION_P (fun))
          {
            tree object = (code == AGGR_INIT_EXPR
                           ? (AGGR_INIT_VIA_CTOR_P (t)
@@ -1342,7 +1342,7 @@ cxx_pretty_printer::declaration_specifiers (tree t)
         do not have a type-specifier in their return types.  */
       if (DECL_CONSTRUCTOR_P (t) || DECL_CONV_FN_P (t))
        function_specifier (t);
-      else if (DECL_NONSTATIC_MEMBER_FUNCTION_P (t))
+      else if (DECL_IOBJ_MEMBER_FUNCTION_P (t))
        declaration_specifiers (TREE_TYPE (TREE_TYPE (t)));
       else
         c_pretty_printer::declaration_specifiers (t);
@@ -1700,7 +1700,7 @@ cxx_pretty_printer::direct_declarator (tree t)
       expression (t);
       pp_cxx_parameter_declaration_clause (this, t);
 
-      if (DECL_NONSTATIC_MEMBER_FUNCTION_P (t))
+      if (DECL_IOBJ_MEMBER_FUNCTION_P (t))
        {
          padding = pp_before;
          pp_cxx_cv_qualifier_seq (this, pp_cxx_implicit_parameter_type (t));
index 80d0327c55798ac66709508c9b28c053d99b6cce..398ec6baa2b38e4e6838a18aaf5a1410e02e8f7a 100644 (file)
@@ -8655,7 +8655,7 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
       && TREE_CODE (decl) == FUNCTION_DECL
       /* #pragma omp declare variant on methods handled in finish_struct
         instead.  */
-      && (!DECL_NONSTATIC_MEMBER_FUNCTION_P (decl)
+      && (!DECL_OBJECT_MEMBER_FUNCTION_P (decl)
          || COMPLETE_TYPE_P (DECL_CONTEXT (decl))))
     if (tree attr = lookup_attribute ("omp declare variant base",
                                      DECL_ATTRIBUTES (decl)))
@@ -15645,7 +15645,7 @@ grok_special_member_properties (tree decl)
   tree class_type;
 
   if (TREE_CODE (decl) == USING_DECL
-      || !DECL_NONSTATIC_MEMBER_FUNCTION_P (decl))
+      || !DECL_OBJECT_MEMBER_FUNCTION_P (decl))
     return;
 
   class_type = DECL_CONTEXT (decl);
@@ -17835,7 +17835,7 @@ start_preparsed_function (tree decl1, tree attrs, int flags)
   /* Start the statement-tree, start the tree now.  */
   DECL_SAVED_TREE (decl1) = push_stmt_list ();
 
-  if (DECL_NONSTATIC_MEMBER_FUNCTION_P (decl1))
+  if (DECL_IOBJ_MEMBER_FUNCTION_P (decl1))
     {
       /* We know that this was set up by `grokclassfn'.  We do not
         wait until `store_parm_decls', since evil parse errors may
@@ -18304,7 +18304,7 @@ outer_curly_brace_block (tree fndecl)
 static void
 record_key_method_defined (tree fndecl)
 {
-  if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fndecl)
+  if (DECL_OBJECT_MEMBER_FUNCTION_P (fndecl)
       && DECL_VIRTUAL_P (fndecl)
       && !processing_template_decl)
     {
index 5ceed567599280425441ad4e1a119e381f82c982..fdc52a0b1ce0a490e55e513911d020a2449d7433 100644 (file)
@@ -5676,7 +5676,7 @@ cp_handle_deprecated_or_unavailable (tree decl, tsubst_flags_t complain)
   if (cxx_dialect >= cxx11
       && DECL_P (decl)
       && DECL_ARTIFICIAL (decl)
-      && DECL_NONSTATIC_MEMBER_FUNCTION_P (decl)
+      && DECL_IOBJ_MEMBER_FUNCTION_P (decl)
       && copy_fn_p (decl))
     {
       /* Don't warn if the flag was disabled around the class definition
index 09584719ee6c09b4224aa8b36f6206a2cdb8f985..bbcd1878ffa7684d26a247f2950107ed24da68aa 100644 (file)
@@ -866,7 +866,7 @@ find_uninit_fields_r (tree *tp, int *walk_subtrees, void *data)
   else if (code == CALL_EXPR)
     {
       tree fn = get_callee_fndecl (init);
-      if (fn && DECL_NONSTATIC_MEMBER_FUNCTION_P (fn))
+      if (fn && DECL_IOBJ_MEMBER_FUNCTION_P (fn))
        {
          tree op = CALL_EXPR_ARG (init, 0);
          if (TREE_CODE (op) == ADDR_EXPR)
@@ -2477,7 +2477,7 @@ build_offset_ref (tree type, tree member, bool address_p,
 
           -- in a mem-initializer for a constructor for that class or for
           a class derived from that class (_class.base.init_).  */
-      if (DECL_NONSTATIC_MEMBER_FUNCTION_P (member))
+      if (DECL_OBJECT_MEMBER_FUNCTION_P (member))
        {
          /* Build a representation of the qualified name suitable
             for use as the operand to "&" -- even though the "&" is
index f995522283722d56d168314a9fedbb7a9f70dc8f..04f159fe8e9f3f6edc029987ff6350bf8468ef08 100644 (file)
@@ -834,8 +834,9 @@ lambda_expr_this_capture (tree lambda, int add_capture_p)
 
          if (!LAMBDA_FUNCTION_P (containing_function))
            {
-             /* We found a non-lambda function.  */
-             if (DECL_NONSTATIC_MEMBER_FUNCTION_P (containing_function))
+             /* We found a non-lambda function.
+                There is no this pointer in xobj member functions.  */
+             if (DECL_IOBJ_MEMBER_FUNCTION_P (containing_function))
                /* First parameter is 'this'.  */
                init = DECL_ARGUMENTS (containing_function);
              break;
@@ -969,7 +970,7 @@ maybe_generic_this_capture (tree object, tree fns)
        for (lkp_iterator iter (fns); iter; ++iter)
          if (((!id_expr && TREE_CODE (*iter) != USING_DECL)
               || TREE_CODE (*iter) == TEMPLATE_DECL)
-             && DECL_NONSTATIC_MEMBER_FUNCTION_P (*iter))
+             && DECL_IOBJ_MEMBER_FUNCTION_P (*iter))
            {
              /* Found a non-static member.  Capture this.  */
              lambda_expr_this_capture (lam, /*maybe*/-1);
@@ -1012,7 +1013,7 @@ nonlambda_method_basetype (void)
 
       tree fn = TYPE_CONTEXT (type);
       if (!fn || TREE_CODE (fn) != FUNCTION_DECL
-         || !DECL_NONSTATIC_MEMBER_FUNCTION_P (fn))
+         || !DECL_IOBJ_MEMBER_FUNCTION_P (fn))
        /* No enclosing non-lambda method.  */
        return NULL_TREE;
       if (!LAMBDA_FUNCTION_P (fn))
index 0546860604dbf3a1f799756690314f3d29ce5292..7d8f443f85c7e61ef05bf88da35f5aea7b873f0f 100644 (file)
@@ -1231,9 +1231,9 @@ write_nested_name (const tree decl)
 
   write_char ('N');
 
-  /* Write CV-qualifiers, if this is a member function.  */
+  /* Write CV-qualifiers, if this is an iobj member function.  */
   if (TREE_CODE (decl) == FUNCTION_DECL
-      && DECL_NONSTATIC_MEMBER_FUNCTION_P (decl))
+      && DECL_IOBJ_MEMBER_FUNCTION_P (decl))
     {
       if (DECL_VOLATILE_MEMFUNC_P (decl))
        write_char ('V');
index fcf6cfa451235fc1df81c1ee031a268ce0e2b7f7..aa5a044883e9895a437785dfe63ad01e5528a49e 100644 (file)
@@ -1187,7 +1187,7 @@ early_check_defaulted_comparison (tree fn)
        ok = false;
     }
 
-  bool mem = DECL_NONSTATIC_MEMBER_FUNCTION_P (fn);
+  bool mem = DECL_IOBJ_MEMBER_FUNCTION_P (fn);
   if (mem && type_memfn_quals (TREE_TYPE (fn)) != TYPE_QUAL_CONST)
     {
       error_at (loc, "defaulted %qD must be %<const%>", fn);
@@ -1230,7 +1230,7 @@ early_check_defaulted_comparison (tree fn)
 
   if (saw_bad || (saw_byval && saw_byref))
     {
-      if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fn))
+      if (DECL_IOBJ_MEMBER_FUNCTION_P (fn))
        error_at (loc, "defaulted member %qD must have parameter type "
                  "%<const %T&%>", fn, ctx);
       else if (saw_bad)
@@ -3606,7 +3606,7 @@ lazily_declare_fn (special_function_kind sfk, tree type)
 tree
 skip_artificial_parms_for (const_tree fn, tree list)
 {
-  if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fn))
+  if (DECL_IOBJ_MEMBER_FUNCTION_P (fn))
     list = TREE_CHAIN (list);
   else
     return list;
@@ -3626,7 +3626,7 @@ num_artificial_parms_for (const_tree fn)
 {
   int count = 0;
 
-  if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fn))
+  if (DECL_IOBJ_MEMBER_FUNCTION_P (fn))
     count++;
   else
     return 0;
index 9bb6d2643d8e3075c324acfd77f5ca419f5dc8b0..aa75e2809d8fdca14443c6b911bf725f6d286d20 100644 (file)
@@ -5683,8 +5683,9 @@ trees_out::lang_decl_bools (tree t)
       WB (lang->u.fn.has_dependent_explicit_spec_p);
       WB (lang->u.fn.immediate_fn_p);
       WB (lang->u.fn.maybe_deleted);
-      WB (lang->u.fn.escalated_p);
       /* We do not stream lang->u.fn.implicit_constexpr.  */
+      WB (lang->u.fn.escalated_p);
+      WB (lang->u.fn.xobj_func);
       goto lds_min;
 
     case lds_decomp:  /* lang_decl_decomp.  */
@@ -5753,8 +5754,9 @@ trees_in::lang_decl_bools (tree t)
       RB (lang->u.fn.has_dependent_explicit_spec_p);
       RB (lang->u.fn.immediate_fn_p);
       RB (lang->u.fn.maybe_deleted);
-      RB (lang->u.fn.escalated_p);
       /* We do not stream lang->u.fn.implicit_constexpr.  */
+      RB (lang->u.fn.escalated_p);
+      RB (lang->u.fn.xobj_func);
       goto lds_min;
 
     case lds_decomp:  /* lang_decl_decomp.  */
index 7237bd3898fb1a0c36728a58fbec9d1620b53182..da4b7fab7043b9c41a4640ffb93372217de6dc97 100644 (file)
@@ -1446,9 +1446,9 @@ is_specialization_of_friend (tree decl, tree friend_decl)
             `this' parameter.  */
          friend_args_type = TYPE_ARG_TYPES (friend_type);
          decl_args_type = TYPE_ARG_TYPES (decl_type);
-         if (DECL_NONSTATIC_MEMBER_FUNCTION_P (friend_decl))
+         if (DECL_IOBJ_MEMBER_FUNCTION_P (friend_decl))
            friend_args_type = TREE_CHAIN (friend_args_type);
-         if (DECL_NONSTATIC_MEMBER_FUNCTION_P (decl))
+         if (DECL_IOBJ_MEMBER_FUNCTION_P (decl))
            decl_args_type = TREE_CHAIN (decl_args_type);
 
          return compparms (decl_args_type, friend_args_type);
@@ -2236,7 +2236,7 @@ determine_specialization (tree template_id,
             that the const qualification is the same.  Since
             get_bindings does not try to merge the "this" parameter,
             we must do the comparison explicitly.  */
-         if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fn))
+         if (DECL_IOBJ_MEMBER_FUNCTION_P (fn))
            {
              if (!same_type_p (TREE_VALUE (fn_arg_types),
                                TREE_VALUE (decl_arg_types)))
@@ -2359,14 +2359,14 @@ determine_specialization (tree template_id,
          /* Adjust the type of DECL in case FN is a static member.  */
          decl_arg_types = TYPE_ARG_TYPES (TREE_TYPE (decl));
          if (DECL_STATIC_FUNCTION_P (fn)
-             && DECL_NONSTATIC_MEMBER_FUNCTION_P (decl))
+             && DECL_IOBJ_MEMBER_FUNCTION_P (decl))
            decl_arg_types = TREE_CHAIN (decl_arg_types);
 
          if (!compparms (TYPE_ARG_TYPES (TREE_TYPE (fn)),
                         decl_arg_types))
             continue;
 
-         if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fn)
+         if (DECL_IOBJ_MEMBER_FUNCTION_P (fn)
              && (type_memfn_rqual (TREE_TYPE (decl))
                  != type_memfn_rqual (TREE_TYPE (fn))))
            continue;
@@ -2552,7 +2552,7 @@ copy_default_args_to_explicit_spec (tree decl)
   old_type = TREE_TYPE (decl);
   spec_types = TYPE_ARG_TYPES (old_type);
 
-  if (DECL_NONSTATIC_MEMBER_FUNCTION_P (decl))
+  if (DECL_IOBJ_MEMBER_FUNCTION_P (decl))
     {
       /* Remove the this pointer, but remember the object's type for
         CV quals.  */
@@ -3137,7 +3137,7 @@ check_explicit_specialization (tree declarator,
             make DECL a static member function as well.  */
          if (DECL_FUNCTION_TEMPLATE_P (tmpl)
              && DECL_STATIC_FUNCTION_P (tmpl)
-             && DECL_NONSTATIC_MEMBER_FUNCTION_P (decl))
+             && DECL_IOBJ_MEMBER_FUNCTION_P (decl))
            revert_static_member_fn (decl);
 
          /* If this is a specialization of a member template of a
@@ -11814,7 +11814,7 @@ tsubst_contract_attribute (tree decl, tree t, tree args,
   /* For member functions, make this available for semantic analysis.  */
   tree save_ccp = current_class_ptr;
   tree save_ccr = current_class_ref;
-  if (DECL_NONSTATIC_MEMBER_FUNCTION_P (decl))
+  if (DECL_IOBJ_MEMBER_FUNCTION_P (decl))
     {
       tree arg_types = TYPE_ARG_TYPES (TREE_TYPE (decl));
       tree this_type = TREE_TYPE (TREE_VALUE (arg_types));
@@ -22130,7 +22130,7 @@ check_non_deducible_conversions (tree parms, const tree *args, unsigned nargs,
 {
   /* Non-constructor methods need to leave a conversion for 'this', which
      isn't included in nargs here.  */
-  unsigned offset = (DECL_NONSTATIC_MEMBER_FUNCTION_P (fn)
+  unsigned offset = (DECL_IOBJ_MEMBER_FUNCTION_P (fn)
                     && !DECL_CONSTRUCTOR_P (fn));
 
   for (unsigned ia = 0;
@@ -25357,16 +25357,16 @@ more_specialized_fn (tree pat1, tree pat2, int len)
         I think think the old G++ behavior of just skipping the object
         parameter when comparing to a static member function was better, so
         let's stick with that for now.  This is CWG2834.  --jason 2023-12 */
-      if (DECL_NONSTATIC_MEMBER_FUNCTION_P (decl1)) /* FIXME or explicit */
+      if (DECL_OBJECT_MEMBER_FUNCTION_P (decl1))
        {
          len--; /* LEN is the number of significant arguments for DECL1 */
          args1 = TREE_CHAIN (args1);
        }
-      else if (DECL_NONSTATIC_MEMBER_FUNCTION_P (decl2)) /* FIXME or explicit */
+      else if (DECL_OBJECT_MEMBER_FUNCTION_P (decl2))
        args2 = TREE_CHAIN (args2);
     }
-  else if (DECL_NONSTATIC_MEMBER_FUNCTION_P (decl1) /* FIXME implicit only */
-          && DECL_NONSTATIC_MEMBER_FUNCTION_P (decl2))
+  else if (DECL_IOBJ_MEMBER_FUNCTION_P (decl1)
+          && DECL_IOBJ_MEMBER_FUNCTION_P (decl2))
     {
       /* Note DR2445 also (IMO wrongly) removed the "only one" above, which
         would break e.g.  cpp1y/lambda-generic-variadic5.C.  */
@@ -25374,12 +25374,12 @@ more_specialized_fn (tree pat1, tree pat2, int len)
       args1 = TREE_CHAIN (args1);
       args2 = TREE_CHAIN (args2);
     }
-  else if (DECL_NONSTATIC_MEMBER_FUNCTION_P (decl1) /* FIXME implicit only */
-          || DECL_NONSTATIC_MEMBER_FUNCTION_P (decl2))
+  else if (DECL_IOBJ_MEMBER_FUNCTION_P (decl1)
+          || DECL_IOBJ_MEMBER_FUNCTION_P (decl2))
     {
       /* The other is a non-member or explicit object member function;
         rewrite the implicit object parameter to a reference.  */
-      tree ns = DECL_NONSTATIC_MEMBER_FUNCTION_P (decl2) ? decl2 : decl1;
+      tree ns = DECL_IOBJ_MEMBER_FUNCTION_P (decl2) ? decl2 : decl1;
       tree &nsargs = ns == decl2 ? args2 : args1;
       tree obtype = TREE_TYPE (TREE_VALUE (nsargs));
 
@@ -26712,7 +26712,7 @@ maybe_instantiate_noexcept (tree fn, tsubst_flags_t complain)
          push_deferring_access_checks (dk_no_deferred);
          input_location = DECL_SOURCE_LOCATION (fn);
 
-         if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fn)
+         if (DECL_IOBJ_MEMBER_FUNCTION_P (fn)
              && !DECL_LOCAL_DECL_P (fn))
            {
              /* If needed, set current_class_ptr for the benefit of
@@ -26775,7 +26775,7 @@ register_parameter_specializations (tree pattern, tree inst)
 {
   tree tmpl_parm = DECL_ARGUMENTS (pattern);
   tree spec_parm = DECL_ARGUMENTS (inst);
-  if (DECL_NONSTATIC_MEMBER_FUNCTION_P (inst))
+  if (DECL_IOBJ_MEMBER_FUNCTION_P (inst))
     {
       register_local_specialization (spec_parm, tmpl_parm);
       spec_parm = skip_artificial_parms_for (inst, spec_parm);
@@ -28118,7 +28118,7 @@ value_dependent_expression_p (tree expression)
               cause the call to be considered value-dependent.  We also
               look through it in potential_constant_expression.  */
            if (i == 0 && fn && DECL_DECLARED_CONSTEXPR_P (fn)
-               && DECL_NONSTATIC_MEMBER_FUNCTION_P (fn)
+               && DECL_IOBJ_MEMBER_FUNCTION_P (fn)
                && TREE_CODE (op) == ADDR_EXPR)
              op = TREE_OPERAND (op, 0);
            if (value_dependent_expression_p (op))
index 9432200a763393eec0a6f3cee22dc1739442fc71..f7be4a1c9b2f840d1607658bf53f39bc1e2a10aa 100644 (file)
@@ -1008,7 +1008,7 @@ shared_member_p (tree t)
            /* Conservatively assume a dependent using-declaration
               might resolve to a non-static member.  */
            return false;
-         if (DECL_NONSTATIC_MEMBER_FUNCTION_P (decl))
+         if (DECL_OBJECT_MEMBER_FUNCTION_P (decl))
            return false;
        }
       return true;
@@ -1264,7 +1264,7 @@ lookup_member (tree xbasetype, tree name, int protect, bool want_type,
       decl = strip_using_decl (decl);
       /* A dependent USING_DECL will be checked after tsubsting.  */
       if (TREE_CODE (decl) != USING_DECL
-         && !DECL_NONSTATIC_MEMBER_FUNCTION_P (decl)
+         && !DECL_IOBJ_MEMBER_FUNCTION_P (decl)
          && !perform_or_defer_access_check (basetype_path, decl, decl,
                                             complain, afi))
        return error_mark_node;
@@ -1737,6 +1737,7 @@ field_access_p (tree component_ref, tree field_decl, tree field_type)
     return false;
 
   tree ptr = STRIP_NOPS (TREE_OPERAND (indirect_ref, 0));
+  /* ??? is_object_parameter?  */
   if (!is_this_parameter (ptr))
     return false;
 
index 2162c5768adb9693e3f5f44119b893724ec2389d..8ff69622bd4f09c1a8eef01d710cadb236ad686d 100644 (file)
@@ -6727,7 +6727,7 @@ finish_omp_declare_simd_methods (tree t)
   for (tree x = TYPE_FIELDS (t); x; x = DECL_CHAIN (x))
     {
       if (TREE_CODE (x) == USING_DECL
-         || !DECL_NONSTATIC_MEMBER_FUNCTION_P (x))
+         || !DECL_IOBJ_MEMBER_FUNCTION_P (x))
        continue;
       tree ods = lookup_attribute ("omp declare simd", DECL_ATTRIBUTES (x));
       if (!ods || !TREE_VALUE (ods))
index 5dc495e3b7e4d97cf9ed7dc2ab5b3640db27c3b6..f2e0f28bf06ac934b5f97510af242a451d532f7a 100644 (file)
@@ -298,7 +298,7 @@ lvalue_kind (const_tree ref)
     case FUNCTION_DECL:
       /* All functions (except non-static-member functions) are
         lvalues.  */
-      return (DECL_NONSTATIC_MEMBER_FUNCTION_P (ref)
+      return (DECL_IOBJ_MEMBER_FUNCTION_P (ref)
              ? clk_none : clk_ordinary);
 
     case BASELINK:
index cfcaf128d86cbceba6b81fc664d4365d3c94729a..d101cf0bca99a538664979d42dc58aa8b76e0cd0 100644 (file)
@@ -2352,7 +2352,7 @@ invalid_nonstatic_memfn_p (location_t loc, tree expr, tsubst_flags_t complain)
   if (is_overloaded_fn (expr) && !really_overloaded_fn (expr))
     expr = get_first_fn (expr);
   if (TREE_TYPE (expr)
-      && DECL_NONSTATIC_MEMBER_FUNCTION_P (expr))
+      && DECL_IOBJ_MEMBER_FUNCTION_P (expr))
     {
       if (complain & tf_error)
        {
index 5b73e36fad903d81a8c7068d840a7e913c271454..7f4e4c9806093659bb0a998644ca4a3cf3f6beed 100644 (file)
@@ -468,7 +468,7 @@ plugin_pragma_push_user_expression (cpp_reader *)
        }
     }
 
-  if (unchanged_cfun || DECL_NONSTATIC_MEMBER_FUNCTION_P (changed_func_decl))
+  if (unchanged_cfun || DECL_OBJECT_MEMBER_FUNCTION_P (changed_func_decl))
     {
       /* Check whether the oracle supplies us with a "this", and if
         so, arrange for data members and this itself to be