mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-10 11:10:53 +08:00
re PR c++/28288 (ICE with min/max operator)
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
This commit is contained in:
parent
ac1ed908de
commit
b52dbbf865
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
14
libcpp/lex.c
14
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. */
|
||||
|
Loading…
x
Reference in New Issue
Block a user