From b52dbbf86510c011400a97e204cf9384fef83b0c Mon Sep 17 00:00:00 2001 From: Steve Ellcey Date: Mon, 14 Aug 2006 23:13:54 +0000 Subject: [PATCH] re PR c++/28288 (ICE with min/max operator) PR c++/28288 PR c++/14556 * operators.def: Remove , ?= operators. * parser.c: Remove CPP_MIN, CPP_MAX, CPP_MIN_EQ, and CPP_MAX_EQ. (cp_parser_warn_min_max): Remove. * include/cpplib.h: Remove ?, ?= tokens. (CPP_LAST_EQ): Change. (CPP_LAST_PUNCTUATOR): Change. * expr.c (cpp_operator): Remove MIN and MAX. (reduce): Remove CPP_MIN and CPP_MAX. (num_binary_op): Ditto. * lex.c (_cpp_lex_direct): Ditto. (cpp_avoid_paste): Remove ? as legal symbol after > or <. From-SVN: r116140 --- gcc/cp/ChangeLog | 8 ++++++++ gcc/cp/operators.def | 6 ------ gcc/cp/parser.c | 45 --------------------------------------------- libcpp/ChangeLog | 13 +++++++++++++ libcpp/expr.c | 21 --------------------- libcpp/include/cpplib.h | 13 ++++++------- libcpp/lex.c | 14 ++------------ 7 files changed, 29 insertions(+), 91 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5737a62..9194192 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2006-08-14 Steve Ellcey + + PR c++/28288 + PR c++/14556 + * operators.def: Remove , ?= operators. + * parser.c: Remove CPP_MIN, CPP_MAX, CPP_MIN_EQ, and CPP_MAX_EQ. + (cp_parser_warn_min_max): Remove. + 2006-08-11 Jason Merrill PR c++/28559 diff --git a/gcc/cp/operators.def b/gcc/cp/operators.def index b14835c..4518843 100644 --- a/gcc/cp/operators.def +++ b/gcc/cp/operators.def @@ -129,9 +129,6 @@ DEF_SIMPLE_OPERATOR ("->", COMPONENT_REF, "pt", 2) DEF_SIMPLE_OPERATOR ("[]", ARRAY_REF, "ix", 2) DEF_SIMPLE_OPERATOR ("++", POSTINCREMENT_EXPR, "pp", 2) DEF_SIMPLE_OPERATOR ("--", POSTDECREMENT_EXPR, "mm", 2) -/* These operators are GNU extensions. */ -DEF_SIMPLE_OPERATOR ("?", MAX_EXPR, "v23max", 2) /* This one is needed for mangling. */ DEF_SIMPLE_OPERATOR ("::", SCOPE_REF, "sr", 2) @@ -147,9 +144,6 @@ DEF_ASSN_OPERATOR ("|=", BIT_IOR_EXPR, "oR", 2) DEF_ASSN_OPERATOR ("^=", BIT_XOR_EXPR, "eO", 2) DEF_ASSN_OPERATOR ("<<=", LSHIFT_EXPR, "lS", 2) DEF_ASSN_OPERATOR (">>=", RSHIFT_EXPR, "rS", 2) -/* These operators are GNU extensions. */ -DEF_ASSN_OPERATOR ("?=", MAX_EXPR, "v23maX", 2) /* Ternary operators. */ DEF_SIMPLE_OPERATOR ("?:", COND_EXPR, "qu", 3) diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 35ce410..7bfa866 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -1150,8 +1150,6 @@ static const cp_parser_binary_operations_map_node binops[] = { { CPP_GREATER, GT_EXPR, PREC_RELATIONAL_EXPRESSION }, { CPP_LESS_EQ, LE_EXPR, PREC_RELATIONAL_EXPRESSION }, { CPP_GREATER_EQ, GE_EXPR, PREC_RELATIONAL_EXPRESSION }, - { CPP_MIN, MIN_EXPR, PREC_RELATIONAL_EXPRESSION }, - { CPP_MAX, MAX_EXPR, PREC_RELATIONAL_EXPRESSION }, { CPP_EQ_EQ, EQ_EXPR, PREC_EQUALITY_EXPRESSION }, { CPP_NOT_EQ, NE_EXPR, PREC_EQUALITY_EXPRESSION }, @@ -1855,16 +1853,6 @@ cp_parser_is_keyword (cp_token* token, enum rid keyword) return token->keyword == keyword; } -/* A minimum or maximum operator has been seen. As these are - deprecated, issue a warning. */ - -static inline void -cp_parser_warn_min_max (void) -{ - if (warn_deprecated && !in_system_header) - warning (OPT_Wdeprecated, "minimum/maximum operators are deprecated"); -} - /* If not parsing tentatively, issue a diagnostic of the form FILE:LINE: MESSAGE before TOKEN where TOKEN is the next token in the input stream. MESSAGE @@ -5613,8 +5601,6 @@ cp_parser_binary_expression (cp_parser* parser, bool cast_p) { /* Get an operator token. */ token = cp_lexer_peek_token (parser->lexer); - if (token->type == CPP_MIN || token->type == CPP_MAX) - cp_parser_warn_min_max (); new_prec = TOKEN_PRECEDENCE (token); @@ -5869,16 +5855,6 @@ cp_parser_assignment_operator_opt (cp_parser* parser) op = BIT_IOR_EXPR; break; - case CPP_MIN_EQ: - op = MIN_EXPR; - cp_parser_warn_min_max (); - break; - - case CPP_MAX_EQ: - op = MAX_EXPR; - cp_parser_warn_min_max (); - break; - default: /* Nothing else is an assignment operator. */ op = ERROR_MARK; @@ -8330,27 +8306,6 @@ cp_parser_operator (cp_parser* parser) cp_parser_require (parser, CPP_CLOSE_SQUARE, "`]'"); return ansi_opname (ARRAY_REF); - /* Extensions. */ - case CPP_MIN: - id = ansi_opname (MIN_EXPR); - cp_parser_warn_min_max (); - break; - - case CPP_MAX: - id = ansi_opname (MAX_EXPR); - cp_parser_warn_min_max (); - break; - - case CPP_MIN_EQ: - id = ansi_assopname (MIN_EXPR); - cp_parser_warn_min_max (); - break; - - case CPP_MAX_EQ: - id = ansi_assopname (MAX_EXPR); - cp_parser_warn_min_max (); - break; - default: /* Anything else is an error. */ break; diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog index 865287b..98d2cc2 100644 --- a/libcpp/ChangeLog +++ b/libcpp/ChangeLog @@ -1,3 +1,16 @@ +2006-08-14 Steve Ellcey + + PR c++/28288 + PR c++/14556 + * include/cpplib.h: Remove ?, ?= tokens. + (CPP_LAST_EQ): Change. + (CPP_LAST_PUNCTUATOR): Change. + * expr.c (cpp_operator): Remove MIN and MAX. + (reduce): Remove CPP_MIN and CPP_MAX. + (num_binary_op): Ditto. + * lex.c (_cpp_lex_direct): Ditto. + (cpp_avoid_paste): Remove ? as legal symbol after > or <. + 2006-06-09 Jakub Jelinek PR preprocessor/27746 diff --git a/libcpp/expr.c b/libcpp/expr.c index a61ff66..574b85f 100644 --- a/libcpp/expr.c +++ b/libcpp/expr.c @@ -668,9 +668,6 @@ static const struct cpp_operator /* RSHIFT */ {13, LEFT_ASSOC}, /* LSHIFT */ {13, LEFT_ASSOC}, - /* MIN */ {10, LEFT_ASSOC | CHECK_PROMOTION}, - /* MAX */ {10, LEFT_ASSOC | CHECK_PROMOTION}, - /* COMPL */ {16, NO_L_OPERAND}, /* AND_AND */ {6, LEFT_ASSOC}, /* OR_OR */ {5, LEFT_ASSOC}, @@ -882,8 +879,6 @@ reduce (cpp_reader *pfile, struct op *top, enum cpp_ttype op) case CPP_MINUS: case CPP_RSHIFT: case CPP_LSHIFT: - case CPP_MIN: - case CPP_MAX: case CPP_COMMA: top[-1].value = num_binary_op (pfile, top[-1].value, top->value, top->op); @@ -1309,7 +1304,6 @@ num_binary_op (cpp_reader *pfile, cpp_num lhs, cpp_num rhs, enum cpp_ttype op) { cpp_num result; size_t precision = CPP_OPTION (pfile, precision); - bool gte; size_t n; switch (op) @@ -1336,21 +1330,6 @@ num_binary_op (cpp_reader *pfile, cpp_num lhs, cpp_num rhs, enum cpp_ttype op) lhs = num_rshift (lhs, precision, n); break; - /* Min / Max. */ - case CPP_MIN: - case CPP_MAX: - { - bool unsignedp = lhs.unsignedp || rhs.unsignedp; - - gte = num_greater_eq (lhs, rhs, precision); - if (op == CPP_MIN) - gte = !gte; - if (!gte) - lhs = rhs; - lhs.unsignedp = unsignedp; - } - break; - /* Arithmetic. */ case CPP_MINUS: rhs = num_negate (rhs, precision); diff --git a/libcpp/include/cpplib.h b/libcpp/include/cpplib.h index 2cea1f5..5fb80d9 100644 --- a/libcpp/include/cpplib.h +++ b/libcpp/include/cpplib.h @@ -51,7 +51,10 @@ struct _cpp_file; The first group, to CPP_LAST_EQ, can be immediately followed by an '='. The lexer needs operators ending in '=', like ">>=", to be in - the same order as their counterparts without the '=', like ">>". */ + the same order as their counterparts without the '=', like ">>". + + See the cpp_operator table optab in expr.c if you change the order or + add or remove anything in the first group. */ #define TTYPE_TABLE \ OP(EQ, "=") \ @@ -68,8 +71,6 @@ struct _cpp_file; OP(XOR, "^") \ OP(RSHIFT, ">>") \ OP(LSHIFT, "<<") \ - OP(MIN, "?") \ \ OP(COMPL, "~") \ OP(AND_AND, "&&") /* logical */ \ @@ -97,8 +98,6 @@ struct _cpp_file; OP(XOR_EQ, "^=") \ OP(RSHIFT_EQ, ">>=") \ OP(LSHIFT_EQ, "<<=") \ - OP(MIN_EQ, "?=") \ /* Digraphs together, beginning with CPP_FIRST_DIGRAPH. */ \ OP(HASH, "#") /* digraphs */ \ OP(PASTE, "##") \ @@ -146,9 +145,9 @@ enum cpp_ttype N_TTYPES, /* Positions in the table. */ - CPP_LAST_EQ = CPP_MAX, + CPP_LAST_EQ = CPP_LSHIFT, CPP_FIRST_DIGRAPH = CPP_HASH, - CPP_LAST_PUNCTUATOR= CPP_DOT_STAR, + CPP_LAST_PUNCTUATOR= CPP_ATSIGN, CPP_LAST_CPP_OP = CPP_LESS_EQ }; #undef OP diff --git a/libcpp/lex.c b/libcpp/lex.c index cae9b03..6dc0fd9 100644 --- a/libcpp/lex.c +++ b/libcpp/lex.c @@ -1052,11 +1052,6 @@ _cpp_lex_direct (cpp_reader *pfile) buffer->cur++; IF_NEXT_IS ('=', CPP_LSHIFT_EQ, CPP_LSHIFT); } - else if (*buffer->cur == '?' && CPP_OPTION (pfile, cplusplus)) - { - buffer->cur++; - IF_NEXT_IS ('=', CPP_MIN_EQ, CPP_MIN); - } else if (CPP_OPTION (pfile, digraphs)) { if (*buffer->cur == ':') @@ -1083,11 +1078,6 @@ _cpp_lex_direct (cpp_reader *pfile) buffer->cur++; IF_NEXT_IS ('=', CPP_RSHIFT_EQ, CPP_RSHIFT); } - else if (*buffer->cur == '?' && CPP_OPTION (pfile, cplusplus)) - { - buffer->cur++; - IF_NEXT_IS ('=', CPP_MAX_EQ, CPP_MAX); - } break; case '%': @@ -1472,8 +1462,8 @@ cpp_avoid_paste (cpp_reader *pfile, const cpp_token *token1, switch (a) { - case CPP_GREATER: return c == '>' || c == '?'; - case CPP_LESS: return c == '<' || c == '?' || c == '%' || c == ':'; + case CPP_GREATER: return c == '>'; + case CPP_LESS: return c == '<' || c == '%' || c == ':'; case CPP_PLUS: return c == '+'; case CPP_MINUS: return c == '-' || c == '>'; case CPP_DIV: return c == '/' || c == '*'; /* Comments. */ -- 2.7.4