]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/28288 (ICE with min/max operator)
authorSteve Ellcey <sje@cup.hp.com>
Mon, 14 Aug 2006 23:13:54 +0000 (23:13 +0000)
committerSteve Ellcey <sje@gcc.gnu.org>
Mon, 14 Aug 2006 23:13:54 +0000 (23:13 +0000)
PR c++/28288
PR c++/14556
* operators.def: Remove <?, ?>, <?=, and >?= 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 <?, >?, <?=, and >?= 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
gcc/cp/operators.def
gcc/cp/parser.c
libcpp/ChangeLog
libcpp/expr.c
libcpp/include/cpplib.h
libcpp/lex.c

index 5737a628211b6dcfb3847ff6a928f031a66c8040..9194192f51d836a9a00f8fd8b58edad863071e44 100644 (file)
@@ -1,3 +1,11 @@
+2006-08-14  Steve Ellcey  <sje@cup.hp.com>
+
+       PR c++/28288
+       PR c++/14556
+       * operators.def: Remove <?, ?>, <?=, and >?= 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  <jason@redhat.com>
 
        PR c++/28559
index b14835c27f767841a6a450d688f3ab6167505278..4518843b38fe7ac4237a08e7ef707cbed4ef6915 100644 (file)
@@ -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 ("<?", MIN_EXPR, "v23min", 2)
-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 ("<?=", MIN_EXPR, "v23miN", 2)
-DEF_ASSN_OPERATOR (">?=", MAX_EXPR, "v23maX", 2)
 
 /* Ternary operators.  */
 DEF_SIMPLE_OPERATOR ("?:", COND_EXPR, "qu", 3)
index 35ce410e38f6462ffd66585c421566e2cc20436d..7bfa86665b75bb126427e0d35d2c62e3fc648d2d 100644 (file)
@@ -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;
index 865287b25455d1dbc21932698dfc7006bdad64d2..98d2cc22e7f5a860d09fab2518ff643f94f28fa9 100644 (file)
@@ -1,3 +1,16 @@
+2006-08-14  Steve Ellcey  <sje@cup.hp.com>
+
+       PR c++/28288
+       PR c++/14556
+       * include/cpplib.h: Remove <?, >?, <?=, and >?= 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  <jakub@redhat.com>
 
        PR preprocessor/27746
index a61ff665ec0fa13dbd5556930317b380ab212b1c..574b85ff656dd02b97dfd27f1c292ec6eea19a4e 100644 (file)
@@ -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);
index 2cea1f5afd2ef749974a450235d21ad6a3cb185e..5fb80d9e82092145a34325db614b6a57239a6b56 100644 (file)
@@ -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,              "<?")   /* extension */                         \
-  OP(MAX,              ">?")                                           \
                                                                        \
   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,           "<?=")  /* extension */                         \
-  OP(MAX_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
index cae9b0376636b6c5e6066246eeb43dcef6b965ca..6dc0fd9d8df5e75e5fc6ed357580cb52d990d8ec 100644 (file)
@@ -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.  */