[C++ PATCH] overloaded operator fns [6/N]
https://gcc.gnu.org/ml/gcc-patches/2017-11/msg00019.html gcc/cp/ * cp-tree.h (assign_op_identifier, call_op_identifier): Use compressed code. (struct lang_decl_fn): Use compressed operator code. (DECL_OVERLOADED_OPERATOR_CODE): Replace with ... (DECL_OVERLOADED_OPERATOR_CODE_RAW): ... this. (DECL_OVERLOADED_OPERATOR_CODE_IS): Use it. * decl.c (duplicate_decls): Use DECL_OVERLOADED_OPERATOR_CODE_RAW. (build_library_fn): Likewise. (grok_op_properties): Likewise. * mangle.c (write_unqualified_name): Likewise. * method.c (implicitly_declare_fn): Likewise. * typeck.c (check_return_expr): Use DECL_OVERLOADED_OPERATOR_IS. libcc1/ * libcp1plugin.cc (plugin_build_decl): Use DECL_OVERLOADED_OPERATOR_CODE_RAW. From-SVN: r254314
This commit is contained in:
parent
4a110e3478
commit
ce12115844
|
@ -1,5 +1,18 @@
|
||||||
2017-11-01 Nathan Sidwell <nathan@acm.org>
|
2017-11-01 Nathan Sidwell <nathan@acm.org>
|
||||||
|
|
||||||
|
* cp-tree.h (assign_op_identifier, call_op_identifier): Use
|
||||||
|
compressed code.
|
||||||
|
(struct lang_decl_fn): Use compressed operator code.
|
||||||
|
(DECL_OVERLOADED_OPERATOR_CODE): Replace with ...
|
||||||
|
(DECL_OVERLOADED_OPERATOR_CODE_RAW): ... this.
|
||||||
|
(DECL_OVERLOADED_OPERATOR_CODE_IS): Use it.
|
||||||
|
* decl.c (duplicate_decls): Use DECL_OVERLOADED_OPERATOR_CODE_RAW.
|
||||||
|
(build_library_fn): Likewise.
|
||||||
|
(grok_op_properties): Likewise.
|
||||||
|
* mangle.c (write_unqualified_name): Likewise.
|
||||||
|
* method.c (implicitly_declare_fn): Likewise.
|
||||||
|
* typeck.c (check_return_expr): Use DECL_OVERLOADED_OPERATOR_IS.
|
||||||
|
|
||||||
* cp-tree.h (IDENTIFIER_CP_INDEX): Define.
|
* cp-tree.h (IDENTIFIER_CP_INDEX): Define.
|
||||||
(enum ovl_op_flags): Add OVL_OP_FLAG_AMBIARY.
|
(enum ovl_op_flags): Add OVL_OP_FLAG_AMBIARY.
|
||||||
(enum ovl_op_code): New.
|
(enum ovl_op_code): New.
|
||||||
|
|
|
@ -246,8 +246,8 @@ extern GTY(()) tree cp_global_trees[CPTI_MAX];
|
||||||
#define deleting_dtor_identifier cp_global_trees[CPTI_DELETING_DTOR_IDENTIFIER]
|
#define deleting_dtor_identifier cp_global_trees[CPTI_DELETING_DTOR_IDENTIFIER]
|
||||||
|
|
||||||
#define ovl_op_identifier(ISASS, CODE) (OVL_OP_INFO(ISASS, CODE)->identifier)
|
#define ovl_op_identifier(ISASS, CODE) (OVL_OP_INFO(ISASS, CODE)->identifier)
|
||||||
#define assign_op_identifier (ovl_op_identifier (true, NOP_EXPR))
|
#define assign_op_identifier (ovl_op_info[true][OVL_OP_NOP_EXPR].identifier)
|
||||||
#define call_op_identifier (ovl_op_identifier (false, CALL_EXPR))
|
#define call_op_identifier (ovl_op_info[false][OVL_OP_CALL_EXPR].identifier)
|
||||||
/* The name used for conversion operators -- but note that actual
|
/* The name used for conversion operators -- but note that actual
|
||||||
conversion functions use special identifiers outside the identifier
|
conversion functions use special identifiers outside the identifier
|
||||||
table. */
|
table. */
|
||||||
|
@ -2479,26 +2479,24 @@ struct GTY(()) lang_decl_min {
|
||||||
struct GTY(()) lang_decl_fn {
|
struct GTY(()) lang_decl_fn {
|
||||||
struct lang_decl_min min;
|
struct lang_decl_min min;
|
||||||
|
|
||||||
/* In an overloaded operator, this is the value of
|
/* In a overloaded operator, this is the compressed operator code. */
|
||||||
DECL_OVERLOADED_OPERATOR_P.
|
unsigned ovl_op_code : 6;
|
||||||
FIXME: We should really do better in compressing this. */
|
|
||||||
ENUM_BITFIELD (tree_code) operator_code : 16;
|
|
||||||
|
|
||||||
unsigned global_ctor_p : 1;
|
unsigned global_ctor_p : 1;
|
||||||
unsigned global_dtor_p : 1;
|
unsigned global_dtor_p : 1;
|
||||||
|
|
||||||
unsigned static_function : 1;
|
unsigned static_function : 1;
|
||||||
unsigned pure_virtual : 1;
|
unsigned pure_virtual : 1;
|
||||||
unsigned defaulted_p : 1;
|
unsigned defaulted_p : 1;
|
||||||
unsigned has_in_charge_parm_p : 1;
|
unsigned has_in_charge_parm_p : 1;
|
||||||
unsigned has_vtt_parm_p : 1;
|
unsigned has_vtt_parm_p : 1;
|
||||||
unsigned pending_inline_p : 1;
|
unsigned pending_inline_p : 1;
|
||||||
|
|
||||||
unsigned nonconverting : 1;
|
unsigned nonconverting : 1;
|
||||||
unsigned thunk_p : 1;
|
unsigned thunk_p : 1;
|
||||||
|
|
||||||
unsigned this_thunk_p : 1;
|
unsigned this_thunk_p : 1;
|
||||||
unsigned hidden_friend_p : 1;
|
unsigned hidden_friend_p : 1;
|
||||||
unsigned omp_declare_reduction_p : 1;
|
unsigned omp_declare_reduction_p : 1;
|
||||||
/* 3 spare bits. */
|
unsigned spare : 13;
|
||||||
|
|
||||||
/* 32-bits padding on 64-bit host. */
|
/* 32-bits padding on 64-bit host. */
|
||||||
|
|
||||||
|
@ -2814,14 +2812,14 @@ struct GTY(()) lang_decl {
|
||||||
IDENTIFIER_ASSIGN_OP_P (DECL_NAME (NODE))
|
IDENTIFIER_ASSIGN_OP_P (DECL_NAME (NODE))
|
||||||
|
|
||||||
/* NODE is a function_decl for an overloaded operator. Return its
|
/* NODE is a function_decl for an overloaded operator. Return its
|
||||||
operator code. */
|
compressed (raw) operator code. Note that this is not a TREE_CODE. */
|
||||||
#define DECL_OVERLOADED_OPERATOR_CODE(NODE) \
|
#define DECL_OVERLOADED_OPERATOR_CODE_RAW(NODE) \
|
||||||
(LANG_DECL_FN_CHECK (NODE)->operator_code)
|
(LANG_DECL_FN_CHECK (NODE)->ovl_op_code)
|
||||||
|
|
||||||
/* DECL is an overloaded operator. Test whether it is for TREE_CODE
|
/* DECL is an overloaded operator. Test whether it is for TREE_CODE
|
||||||
(a literal constant). */
|
(a literal constant). */
|
||||||
#define DECL_OVERLOADED_OPERATOR_IS(DECL, CODE) \
|
#define DECL_OVERLOADED_OPERATOR_IS(DECL, CODE) \
|
||||||
(DECL_OVERLOADED_OPERATOR_CODE (DECL) == CODE)
|
(DECL_OVERLOADED_OPERATOR_CODE_RAW (DECL) == OVL_OP_##CODE)
|
||||||
|
|
||||||
/* For FUNCTION_DECLs: nonzero means that this function is a
|
/* For FUNCTION_DECLs: nonzero means that this function is a
|
||||||
constructor or a destructor with an extra in-charge parameter to
|
constructor or a destructor with an extra in-charge parameter to
|
||||||
|
@ -5526,7 +5524,8 @@ extern GTY(()) unsigned char ovl_op_mapping[MAX_TREE_CODES];
|
||||||
extern GTY(()) unsigned char ovl_op_alternate[OVL_OP_MAX];
|
extern GTY(()) unsigned char ovl_op_alternate[OVL_OP_MAX];
|
||||||
|
|
||||||
/* Given an ass_op_p boolean and a tree code, return a pointer to its
|
/* Given an ass_op_p boolean and a tree code, return a pointer to its
|
||||||
overloaded operator info. */
|
overloaded operator info. Tree codes for non-overloaded operators
|
||||||
|
map to the error-operator. */
|
||||||
#define OVL_OP_INFO(IS_ASS_P, TREE_CODE) \
|
#define OVL_OP_INFO(IS_ASS_P, TREE_CODE) \
|
||||||
(&ovl_op_info[(IS_ASS_P) != 0][ovl_op_mapping[(TREE_CODE)]])
|
(&ovl_op_info[(IS_ASS_P) != 0][ovl_op_mapping[(TREE_CODE)]])
|
||||||
/* Overloaded operator info for an identifier for which
|
/* Overloaded operator info for an identifier for which
|
||||||
|
|
|
@ -1920,8 +1920,8 @@ next_arg:;
|
||||||
DECL_OVERRIDE_P (newdecl) |= DECL_OVERRIDE_P (olddecl);
|
DECL_OVERRIDE_P (newdecl) |= DECL_OVERRIDE_P (olddecl);
|
||||||
DECL_THIS_STATIC (newdecl) |= DECL_THIS_STATIC (olddecl);
|
DECL_THIS_STATIC (newdecl) |= DECL_THIS_STATIC (olddecl);
|
||||||
if (DECL_OVERLOADED_OPERATOR_P (olddecl))
|
if (DECL_OVERLOADED_OPERATOR_P (olddecl))
|
||||||
DECL_OVERLOADED_OPERATOR_CODE (newdecl)
|
DECL_OVERLOADED_OPERATOR_CODE_RAW (newdecl)
|
||||||
= DECL_OVERLOADED_OPERATOR_CODE (olddecl);
|
= DECL_OVERLOADED_OPERATOR_CODE_RAW (olddecl);
|
||||||
new_defines_function = DECL_INITIAL (newdecl) != NULL_TREE;
|
new_defines_function = DECL_INITIAL (newdecl) != NULL_TREE;
|
||||||
|
|
||||||
/* Optionally warn about more than one declaration for the same
|
/* Optionally warn about more than one declaration for the same
|
||||||
|
@ -4444,7 +4444,8 @@ build_library_fn (tree name, enum tree_code operator_code, tree type,
|
||||||
DECL_EXTERNAL (fn) = 1;
|
DECL_EXTERNAL (fn) = 1;
|
||||||
TREE_PUBLIC (fn) = 1;
|
TREE_PUBLIC (fn) = 1;
|
||||||
DECL_ARTIFICIAL (fn) = 1;
|
DECL_ARTIFICIAL (fn) = 1;
|
||||||
DECL_OVERLOADED_OPERATOR_CODE (fn) = operator_code;
|
DECL_OVERLOADED_OPERATOR_CODE_RAW (fn)
|
||||||
|
= OVL_OP_INFO (false, operator_code)->ovl_op_code;
|
||||||
SET_DECL_LANGUAGE (fn, lang_c);
|
SET_DECL_LANGUAGE (fn, lang_c);
|
||||||
/* Runtime library routines are, by definition, available in an
|
/* Runtime library routines are, by definition, available in an
|
||||||
external shared object. */
|
external shared object. */
|
||||||
|
@ -12902,7 +12903,7 @@ grok_op_properties (tree decl, bool complain)
|
||||||
operator_code = ovl_op->tree_code;
|
operator_code = ovl_op->tree_code;
|
||||||
op_flags = ovl_op->flags;
|
op_flags = ovl_op->flags;
|
||||||
gcc_checking_assert (operator_code != ERROR_MARK);
|
gcc_checking_assert (operator_code != ERROR_MARK);
|
||||||
DECL_OVERLOADED_OPERATOR_CODE (decl) = operator_code;
|
DECL_OVERLOADED_OPERATOR_CODE_RAW (decl) = ovl_op->ovl_op_code;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (op_flags & OVL_OP_FLAG_ALLOC)
|
if (op_flags & OVL_OP_FLAG_ALLOC)
|
||||||
|
@ -13046,7 +13047,7 @@ grok_op_properties (tree decl, bool complain)
|
||||||
const ovl_op_info_t *ovl_op = &ovl_op_info[false][alt];
|
const ovl_op_info_t *ovl_op = &ovl_op_info[false][alt];
|
||||||
gcc_checking_assert (ovl_op->flags == OVL_OP_FLAG_UNARY);
|
gcc_checking_assert (ovl_op->flags == OVL_OP_FLAG_UNARY);
|
||||||
operator_code = ovl_op->tree_code;
|
operator_code = ovl_op->tree_code;
|
||||||
DECL_OVERLOADED_OPERATOR_CODE (decl) = operator_code;
|
DECL_OVERLOADED_OPERATOR_CODE_RAW (decl) = ovl_op->ovl_op_code;
|
||||||
}
|
}
|
||||||
else if (arity != 2)
|
else if (arity != 2)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1321,8 +1321,8 @@ write_unqualified_name (tree decl)
|
||||||
else if (DECL_OVERLOADED_OPERATOR_P (decl))
|
else if (DECL_OVERLOADED_OPERATOR_P (decl))
|
||||||
{
|
{
|
||||||
const char *mangled_name
|
const char *mangled_name
|
||||||
= (OVL_OP_INFO (DECL_ASSIGNMENT_OPERATOR_P (decl),
|
= (ovl_op_info[DECL_ASSIGNMENT_OPERATOR_P (decl)]
|
||||||
DECL_OVERLOADED_OPERATOR_CODE (decl))->mangled_name);
|
[DECL_OVERLOADED_OPERATOR_CODE_RAW (decl)].mangled_name);
|
||||||
write_string (mangled_name);
|
write_string (mangled_name);
|
||||||
}
|
}
|
||||||
else if (UDLIT_OPER_P (DECL_NAME (decl)))
|
else if (UDLIT_OPER_P (DECL_NAME (decl)))
|
||||||
|
|
|
@ -2078,7 +2078,7 @@ implicitly_declare_fn (special_function_kind kind, tree type,
|
||||||
|
|
||||||
if (!IDENTIFIER_CDTOR_P (name))
|
if (!IDENTIFIER_CDTOR_P (name))
|
||||||
/* Assignment operator. */
|
/* Assignment operator. */
|
||||||
DECL_OVERLOADED_OPERATOR_CODE (fn) = NOP_EXPR;
|
DECL_OVERLOADED_OPERATOR_CODE_RAW (fn) = OVL_OP_NOP_EXPR;
|
||||||
else if (IDENTIFIER_CTOR_P (name))
|
else if (IDENTIFIER_CTOR_P (name))
|
||||||
DECL_CXX_CONSTRUCTOR_P (fn) = true;
|
DECL_CXX_CONSTRUCTOR_P (fn) = true;
|
||||||
else
|
else
|
||||||
|
|
|
@ -9074,9 +9074,8 @@ check_return_expr (tree retval, bool *no_warning)
|
||||||
|
|
||||||
/* Only operator new(...) throw(), can return NULL [expr.new/13]. */
|
/* Only operator new(...) throw(), can return NULL [expr.new/13]. */
|
||||||
if (DECL_OVERLOADED_OPERATOR_P (current_function_decl)
|
if (DECL_OVERLOADED_OPERATOR_P (current_function_decl)
|
||||||
&& (DECL_OVERLOADED_OPERATOR_CODE (current_function_decl) == NEW_EXPR
|
&& (DECL_OVERLOADED_OPERATOR_IS (current_function_decl, NEW_EXPR)
|
||||||
|| (DECL_OVERLOADED_OPERATOR_CODE (current_function_decl)
|
|| DECL_OVERLOADED_OPERATOR_IS (current_function_decl, VEC_NEW_EXPR))
|
||||||
== VEC_NEW_EXPR))
|
|
||||||
&& !TYPE_NOTHROW_P (TREE_TYPE (current_function_decl))
|
&& !TYPE_NOTHROW_P (TREE_TYPE (current_function_decl))
|
||||||
&& ! flag_check_new
|
&& ! flag_check_new
|
||||||
&& retval && null_ptr_cst_p (retval))
|
&& retval && null_ptr_cst_p (retval))
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
2017-11-01 Nathan Sidwell <nathan@acm.org>
|
||||||
|
|
||||||
|
* libcp1plugin.cc (plugin_build_decl): Use
|
||||||
|
DECL_OVERLOADED_OPERATOR_CODE_RAW.
|
||||||
|
|
||||||
2017-10-31 Nathan Sidwell <nathan@acm.org>
|
2017-10-31 Nathan Sidwell <nathan@acm.org>
|
||||||
|
|
||||||
* libcp1plugin.cc (plugin_build_decl): Use ovl_op_identifier.
|
* libcp1plugin.cc (plugin_build_decl): Use ovl_op_identifier.
|
||||||
|
|
|
@ -1412,7 +1412,7 @@ plugin_build_decl (cc1_plugin::connection *self,
|
||||||
DECL_CXX_DESTRUCTOR_P (decl) = 1;
|
DECL_CXX_DESTRUCTOR_P (decl) = 1;
|
||||||
else if ((sym_flags & GCC_CP_FLAG_SPECIAL_FUNCTION)
|
else if ((sym_flags & GCC_CP_FLAG_SPECIAL_FUNCTION)
|
||||||
&& opcode != ERROR_MARK)
|
&& opcode != ERROR_MARK)
|
||||||
DECL_OVERLOADED_OPERATOR_CODE (decl) = opcode;
|
DECL_OVERLOADED_OPERATOR_CODE_RAW (decl) = ovl_op_mapping[opcode];
|
||||||
}
|
}
|
||||||
else if (RECORD_OR_UNION_CODE_P (code))
|
else if (RECORD_OR_UNION_CODE_P (code))
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue