From 6ff16d19d26a41cd7abb01e858529fae54de746a Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Tue, 31 Oct 2017 18:29:08 +0000 Subject: [PATCH] [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 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/lex.c | 44 +++++--------------------------------------- gcc/cp/operators.def | 38 +++++++++++++++++--------------------- 3 files changed, 27 insertions(+), 60 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 82651bf3237..edc806edf8e 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,10 @@ 2017-10-31 Nathan Sidwell + * 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. diff --git a/gcc/cp/lex.c b/gcc/cp/lex.c index cd2d886b1eb..fed44a16429 100644 --- a/gcc/cp/lex.c +++ b/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 (""); - - /* 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. */ diff --git a/gcc/cp/operators.def b/gcc/cp/operators.def index 51f74652943..51d2c3a09f4 100644 --- a/gcc/cp/operators.def +++ b/gcc/cp/operators.def @@ -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) -- 2.30.2