[C++ PATCH] overloaded operator fns [4/N]
https://gcc.gnu.org/ml/gcc-patches/2017-10/msg02362.html * lex.c (init_operators): Allow NULL operator name. Don't add special cases. * operators.def: Use NULL for mangling only operators. Move to after regular operators but move assignment operators last. From-SVN: r254276
This commit is contained in:
parent
8e02e8a0a5
commit
6ff16d19d2
@ -1,5 +1,10 @@
|
||||
2017-10-31 Nathan Sidwell <nathan@acm.org>
|
||||
|
||||
* lex.c (init_operators): Allow NULL operator name. Don't add
|
||||
special cases.
|
||||
* operators.def: Use NULL for mangling only operators. Move to
|
||||
after regular operators but move assignment operators last.
|
||||
|
||||
* cp-tree.h (enum ovl_op_flags): New.
|
||||
(struct operator_name_info_t): Rename arity to flags.
|
||||
* lex.c (set_operator_ident): New.
|
||||
|
44
gcc/cp/lex.c
44
gcc/cp/lex.c
@ -143,48 +143,14 @@ init_operators (void)
|
||||
oni->name = NAME; \
|
||||
oni->mangled_name = MANGLING; \
|
||||
oni->flags = FLAGS; \
|
||||
identifier = set_operator_ident (oni); \
|
||||
\
|
||||
if (KIND != cik_simple_op || !IDENTIFIER_ANY_OP_P (identifier)) \
|
||||
set_identifier_kind (identifier, KIND);
|
||||
if (NAME) { \
|
||||
identifier = set_operator_ident (oni); \
|
||||
if (KIND != cik_simple_op || !IDENTIFIER_ANY_OP_P (identifier)) \
|
||||
set_identifier_kind (identifier, KIND); \
|
||||
}
|
||||
|
||||
#include "operators.def"
|
||||
#undef DEF_OPERATOR
|
||||
|
||||
operator_name_info[(int) TYPE_EXPR] = operator_name_info[(int) CAST_EXPR];
|
||||
operator_name_info[(int) ERROR_MARK].identifier
|
||||
= get_identifier ("<invalid operator>");
|
||||
|
||||
/* Handle some special cases. These operators are not defined in
|
||||
the language, but can be produced internally. We may need them
|
||||
for error-reporting. (Eventually, we should ensure that this
|
||||
does not happen. Error messages involving these operators will
|
||||
be confusing to users.) */
|
||||
|
||||
operator_name_info [(int) INIT_EXPR].name
|
||||
= operator_name_info [(int) MODIFY_EXPR].name;
|
||||
|
||||
operator_name_info [(int) EXACT_DIV_EXPR].name = "(ceiling /)";
|
||||
operator_name_info [(int) CEIL_DIV_EXPR].name = "(ceiling /)";
|
||||
operator_name_info [(int) FLOOR_DIV_EXPR].name = "(floor /)";
|
||||
operator_name_info [(int) ROUND_DIV_EXPR].name = "(round /)";
|
||||
operator_name_info [(int) CEIL_MOD_EXPR].name = "(ceiling %)";
|
||||
operator_name_info [(int) FLOOR_MOD_EXPR].name = "(floor %)";
|
||||
operator_name_info [(int) ROUND_MOD_EXPR].name = "(round %)";
|
||||
|
||||
operator_name_info [(int) ABS_EXPR].name = "abs";
|
||||
operator_name_info [(int) TRUTH_AND_EXPR].name = "strict &&";
|
||||
operator_name_info [(int) TRUTH_OR_EXPR].name = "strict ||";
|
||||
operator_name_info [(int) RANGE_EXPR].name = "...";
|
||||
operator_name_info [(int) UNARY_PLUS_EXPR].name = "+";
|
||||
|
||||
assignment_operator_name_info [(int) EXACT_DIV_EXPR].name = "(exact /=)";
|
||||
assignment_operator_name_info [(int) CEIL_DIV_EXPR].name = "(ceiling /=)";
|
||||
assignment_operator_name_info [(int) FLOOR_DIV_EXPR].name = "(floor /=)";
|
||||
assignment_operator_name_info [(int) ROUND_DIV_EXPR].name = "(round /=)";
|
||||
assignment_operator_name_info [(int) CEIL_MOD_EXPR].name = "(ceiling %=)";
|
||||
assignment_operator_name_info [(int) FLOOR_MOD_EXPR].name = "(floor %=)";
|
||||
assignment_operator_name_info [(int) ROUND_MOD_EXPR].name = "(round %=)";
|
||||
}
|
||||
|
||||
/* Initialize the reserved words. */
|
||||
|
@ -100,13 +100,6 @@ DEF_SIMPLE_OPERATOR ("alignof", ALIGNOF_EXPR, "az", OVL_OP_FLAG_UNARY)
|
||||
DEF_SIMPLE_OPERATOR ("__imag__", IMAGPART_EXPR, "v18__imag__", OVL_OP_FLAG_UNARY)
|
||||
DEF_SIMPLE_OPERATOR ("__real__", REALPART_EXPR, "v18__real__", OVL_OP_FLAG_UNARY)
|
||||
|
||||
/* The cast operators. */
|
||||
DEF_SIMPLE_OPERATOR ("", CAST_EXPR, "cv", OVL_OP_FLAG_UNARY)
|
||||
DEF_SIMPLE_OPERATOR ("dynamic_cast", DYNAMIC_CAST_EXPR, "dc", OVL_OP_FLAG_UNARY)
|
||||
DEF_SIMPLE_OPERATOR ("reinterpret_cast", REINTERPRET_CAST_EXPR, "rc", OVL_OP_FLAG_UNARY)
|
||||
DEF_SIMPLE_OPERATOR ("const_cast", CONST_CAST_EXPR, "cc", OVL_OP_FLAG_UNARY)
|
||||
DEF_SIMPLE_OPERATOR ("static_cast", STATIC_CAST_EXPR, "sc", OVL_OP_FLAG_UNARY)
|
||||
|
||||
/* Binary operators. */
|
||||
DEF_SIMPLE_OPERATOR ("+", PLUS_EXPR, "pl", OVL_OP_FLAG_BINARY)
|
||||
DEF_SIMPLE_OPERATOR ("-", MINUS_EXPR, "mi", OVL_OP_FLAG_BINARY)
|
||||
@ -133,8 +126,23 @@ DEF_SIMPLE_OPERATOR ("->", COMPONENT_REF, "pt", OVL_OP_FLAG_BINARY)
|
||||
DEF_SIMPLE_OPERATOR ("[]", ARRAY_REF, "ix", OVL_OP_FLAG_BINARY)
|
||||
DEF_SIMPLE_OPERATOR ("++", POSTINCREMENT_EXPR, "pp", OVL_OP_FLAG_BINARY)
|
||||
DEF_SIMPLE_OPERATOR ("--", POSTDECREMENT_EXPR, "mm", OVL_OP_FLAG_BINARY)
|
||||
/* This one is needed for mangling. */
|
||||
DEF_SIMPLE_OPERATOR ("::", SCOPE_REF, "sr", OVL_OP_FLAG_BINARY)
|
||||
|
||||
/* Miscellaneous. */
|
||||
DEF_SIMPLE_OPERATOR ("?:", COND_EXPR, "qu", OVL_OP_FLAG_NONE)
|
||||
DEF_SIMPLE_OPERATOR ("()", CALL_EXPR, "cl", OVL_OP_FLAG_NONE)
|
||||
|
||||
/* Operators needed for mangling. */
|
||||
DEF_SIMPLE_OPERATOR (NULL, CAST_EXPR, "cv", OVL_OP_FLAG_NONE)
|
||||
DEF_SIMPLE_OPERATOR (NULL, DYNAMIC_CAST_EXPR, "dc", OVL_OP_FLAG_NONE)
|
||||
DEF_SIMPLE_OPERATOR (NULL, REINTERPRET_CAST_EXPR, "rc", OVL_OP_FLAG_NONE)
|
||||
DEF_SIMPLE_OPERATOR (NULL, CONST_CAST_EXPR, "cc", OVL_OP_FLAG_NONE)
|
||||
DEF_SIMPLE_OPERATOR (NULL, STATIC_CAST_EXPR, "sc", OVL_OP_FLAG_NONE)
|
||||
DEF_SIMPLE_OPERATOR (NULL, SCOPE_REF, "sr", OVL_OP_FLAG_NONE)
|
||||
DEF_SIMPLE_OPERATOR (NULL, EXPR_PACK_EXPANSION, "sp", OVL_OP_FLAG_NONE)
|
||||
DEF_SIMPLE_OPERATOR (NULL, UNARY_LEFT_FOLD_EXPR, "fl", OVL_OP_FLAG_NONE)
|
||||
DEF_SIMPLE_OPERATOR (NULL, UNARY_RIGHT_FOLD_EXPR, "fr", OVL_OP_FLAG_NONE)
|
||||
DEF_SIMPLE_OPERATOR (NULL, BINARY_LEFT_FOLD_EXPR, "fL", OVL_OP_FLAG_NONE)
|
||||
DEF_SIMPLE_OPERATOR (NULL, BINARY_RIGHT_FOLD_EXPR, "fR", OVL_OP_FLAG_NONE)
|
||||
|
||||
/* Assignment operators. */
|
||||
DEF_ASSN_OPERATOR ("=", NOP_EXPR, "aS", OVL_OP_FLAG_BINARY)
|
||||
@ -149,15 +157,3 @@ DEF_ASSN_OPERATOR ("^=", BIT_XOR_EXPR, "eO", OVL_OP_FLAG_BINARY)
|
||||
DEF_ASSN_OPERATOR ("<<=", LSHIFT_EXPR, "lS", OVL_OP_FLAG_BINARY)
|
||||
DEF_ASSN_OPERATOR (">>=", RSHIFT_EXPR, "rS", OVL_OP_FLAG_BINARY)
|
||||
|
||||
/* Ternary operators. */
|
||||
DEF_SIMPLE_OPERATOR ("?:", COND_EXPR, "qu", OVL_OP_FLAG_NONE)
|
||||
|
||||
/* Miscellaneous. */
|
||||
DEF_SIMPLE_OPERATOR ("()", CALL_EXPR, "cl", OVL_OP_FLAG_NONE)
|
||||
|
||||
/* Variadic templates extension. */
|
||||
DEF_SIMPLE_OPERATOR ("...", EXPR_PACK_EXPANSION, "sp", OVL_OP_FLAG_UNARY)
|
||||
DEF_SIMPLE_OPERATOR ("... +", UNARY_LEFT_FOLD_EXPR, "fl", OVL_OP_FLAG_BINARY)
|
||||
DEF_SIMPLE_OPERATOR ("+ ...", UNARY_RIGHT_FOLD_EXPR, "fr", OVL_OP_FLAG_BINARY)
|
||||
DEF_SIMPLE_OPERATOR ("+ ... +", BINARY_LEFT_FOLD_EXPR, "fL", OVL_OP_FLAG_NONE)
|
||||
DEF_SIMPLE_OPERATOR ("+ ... +", BINARY_RIGHT_FOLD_EXPR, "fR", OVL_OP_FLAG_NONE)
|
||||
|
Loading…
Reference in New Issue
Block a user