mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-11-27 13:54:19 +08:00
c++: P0847R7 (deducing this) - prerequisite changes. [PR102609]
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>
This commit is contained in:
parent
9f7afa99c6
commit
f9fbf93dc8
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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));
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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));
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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))
|
||||
|
@ -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');
|
||||
|
@ -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;
|
||||
|
@ -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. */
|
||||
|
38
gcc/cp/pt.cc
38
gcc/cp/pt.cc
@ -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))
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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))
|
||||
|
@ -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:
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user