Commit 43f6dfd3 by Roger Sayle Committed by Roger Sayle

c-tree.h (parser_build_unary_op): New prototype.


	* c-tree.h (parser_build_unary_op): New prototype.
	* c-typeck.c (parser_build_unary_op): New function to construct
	a unary operation in the C parser.
	* c-parser.c (c_parser_unary_expression):  Use the new function
	parser_build_unary_op when appropriate.

From-SVN: r99471
parent 32df413a
2005-05-09 Roger Sayle <roger@eyesopen.com>
* c-tree.h (parser_build_unary_op): New prototype.
* c-typeck.c (parser_build_unary_op): New function to construct
a unary operation in the C parser.
* c-parser.c (c_parser_unary_expression): Use the new function
parser_build_unary_op when appropriate.
2005-05-09 Mark Mitchell <mark@codesourcery.com> 2005-05-09 Mark Mitchell <mark@codesourcery.com>
PR 18655 PR 18655
......
...@@ -4495,66 +4495,45 @@ c_parser_unary_expression (c_parser *parser) ...@@ -4495,66 +4495,45 @@ c_parser_unary_expression (c_parser *parser)
{ {
int ext; int ext;
struct c_expr ret; struct c_expr ret;
ret.original_code = ERROR_MARK;
switch (c_parser_peek_token (parser)->type) switch (c_parser_peek_token (parser)->type)
{ {
case CPP_PLUS_PLUS: case CPP_PLUS_PLUS:
c_parser_consume_token (parser); c_parser_consume_token (parser);
ret.value return parser_build_unary_op (PREINCREMENT_EXPR,
= build_unary_op (PREINCREMENT_EXPR, c_parser_cast_expression (parser, NULL));
c_parser_cast_expression (parser, NULL).value, 0);
overflow_warning (ret.value);
return ret;
case CPP_MINUS_MINUS: case CPP_MINUS_MINUS:
c_parser_consume_token (parser); c_parser_consume_token (parser);
ret.value return parser_build_unary_op (PREDECREMENT_EXPR,
= build_unary_op (PREDECREMENT_EXPR, c_parser_cast_expression (parser, NULL));
c_parser_cast_expression (parser, NULL).value, 0);
overflow_warning (ret.value);
return ret;
case CPP_AND: case CPP_AND:
c_parser_consume_token (parser); c_parser_consume_token (parser);
ret.value return parser_build_unary_op (ADDR_EXPR,
= build_unary_op (ADDR_EXPR, c_parser_cast_expression (parser, NULL));
c_parser_cast_expression (parser, NULL).value, 0);
overflow_warning (ret.value);
return ret;
case CPP_MULT: case CPP_MULT:
c_parser_consume_token (parser); c_parser_consume_token (parser);
ret.value ret.value
= build_indirect_ref (c_parser_cast_expression (parser, NULL).value, = build_indirect_ref (c_parser_cast_expression (parser, NULL).value,
"unary *"); "unary *");
ret.original_code = ERROR_MARK;
return ret; return ret;
case CPP_PLUS: case CPP_PLUS:
c_parser_consume_token (parser); c_parser_consume_token (parser);
if (!c_dialect_objc () && warn_traditional && !in_system_header) if (!c_dialect_objc () && warn_traditional && !in_system_header)
warning (0, "traditional C rejects the unary plus operator"); warning (0, "traditional C rejects the unary plus operator");
ret.value return parser_build_unary_op (CONVERT_EXPR,
= build_unary_op (CONVERT_EXPR, c_parser_cast_expression (parser, NULL));
c_parser_cast_expression (parser, NULL).value, 0);
overflow_warning (ret.value);
return ret;
case CPP_MINUS: case CPP_MINUS:
c_parser_consume_token (parser); c_parser_consume_token (parser);
ret.value return parser_build_unary_op (NEGATE_EXPR,
= build_unary_op (NEGATE_EXPR, c_parser_cast_expression (parser, NULL));
c_parser_cast_expression (parser, NULL).value, 0);
overflow_warning (ret.value);
return ret;
case CPP_COMPL: case CPP_COMPL:
c_parser_consume_token (parser); c_parser_consume_token (parser);
ret.value return parser_build_unary_op (BIT_NOT_EXPR,
= build_unary_op (BIT_NOT_EXPR, c_parser_cast_expression (parser, NULL));
c_parser_cast_expression (parser, NULL).value, 0);
overflow_warning (ret.value);
return ret;
case CPP_NOT: case CPP_NOT:
c_parser_consume_token (parser); c_parser_consume_token (parser);
ret.value return parser_build_unary_op (TRUTH_NOT_EXPR,
= build_unary_op (TRUTH_NOT_EXPR, c_parser_cast_expression (parser, NULL));
c_parser_cast_expression (parser, NULL).value, 0);
overflow_warning (ret.value);
return ret;
case CPP_AND_AND: case CPP_AND_AND:
/* Refer to the address of a label as a pointer. */ /* Refer to the address of a label as a pointer. */
c_parser_consume_token (parser); c_parser_consume_token (parser);
...@@ -4563,14 +4542,14 @@ c_parser_unary_expression (c_parser *parser) ...@@ -4563,14 +4542,14 @@ c_parser_unary_expression (c_parser *parser)
ret.value = finish_label_address_expr ret.value = finish_label_address_expr
(c_parser_peek_token (parser)->value); (c_parser_peek_token (parser)->value);
c_parser_consume_token (parser); c_parser_consume_token (parser);
return ret;
} }
else else
{ {
c_parser_error (parser, "expected identifier"); c_parser_error (parser, "expected identifier");
ret.value = error_mark_node; ret.value = error_mark_node;
return ret;
} }
ret.original_code = ERROR_MARK;
return ret;
case CPP_KEYWORD: case CPP_KEYWORD:
switch (c_parser_peek_token (parser)->keyword) switch (c_parser_peek_token (parser)->keyword)
{ {
...@@ -4586,18 +4565,14 @@ c_parser_unary_expression (c_parser *parser) ...@@ -4586,18 +4565,14 @@ c_parser_unary_expression (c_parser *parser)
return ret; return ret;
case RID_REALPART: case RID_REALPART:
c_parser_consume_token (parser); c_parser_consume_token (parser);
ret.value return parser_build_unary_op (REALPART_EXPR,
= build_unary_op (REALPART_EXPR, c_parser_cast_expression (parser,
c_parser_cast_expression (parser, NULL).value, NULL));
0);
return ret;
case RID_IMAGPART: case RID_IMAGPART:
c_parser_consume_token (parser); c_parser_consume_token (parser);
ret.value return parser_build_unary_op (IMAGPART_EXPR,
= build_unary_op (IMAGPART_EXPR, c_parser_cast_expression (parser,
c_parser_cast_expression (parser, NULL).value, NULL));
0);
return ret;
default: default:
return c_parser_postfix_expression (parser); return c_parser_postfix_expression (parser);
} }
......
...@@ -531,6 +531,7 @@ extern tree build_external_ref (tree, int, location_t); ...@@ -531,6 +531,7 @@ extern tree build_external_ref (tree, int, location_t);
extern void pop_maybe_used (bool); extern void pop_maybe_used (bool);
extern struct c_expr c_expr_sizeof_expr (struct c_expr); extern struct c_expr c_expr_sizeof_expr (struct c_expr);
extern struct c_expr c_expr_sizeof_type (struct c_type_name *); extern struct c_expr c_expr_sizeof_type (struct c_type_name *);
extern struct c_expr parser_build_unary_op (enum tree_code, struct c_expr);
extern struct c_expr parser_build_binary_op (enum tree_code, struct c_expr, extern struct c_expr parser_build_binary_op (enum tree_code, struct c_expr,
struct c_expr); struct c_expr);
extern tree build_conditional_expr (tree, tree, tree); extern tree build_conditional_expr (tree, tree, tree);
......
...@@ -2312,11 +2312,27 @@ convert_arguments (tree typelist, tree values, tree function, tree fundecl) ...@@ -2312,11 +2312,27 @@ convert_arguments (tree typelist, tree values, tree function, tree fundecl)
return nreverse (result); return nreverse (result);
} }
/* This is the entry point used by the parser /* This is the entry point used by the parser to build unary operators
for binary operators in the input. in the input. CODE, a tree_code, specifies the unary operator, and
In addition to constructing the expression, ARG is the operand. For unary plus, the C parser currently uses
we check for operands that were written with other binary operators CONVERT_EXPR for code. */
in a way that is likely to confuse the user. */
struct c_expr
parser_build_unary_op (enum tree_code code, struct c_expr arg)
{
struct c_expr result;
result.original_code = ERROR_MARK;
result.value = build_unary_op (code, arg.value, 0);
overflow_warning (result.value);
return result;
}
/* This is the entry point used by the parser to build binary operators
in the input. CODE, a tree_code, specifies the binary operator, and
ARG1 and ARG2 are the operands. In addition to constructing the
expression, we check for operands that were written with other binary
operators in a way that is likely to confuse the user. */
struct c_expr struct c_expr
parser_build_binary_op (enum tree_code code, struct c_expr arg1, parser_build_binary_op (enum tree_code code, struct c_expr arg1,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment