static bool c_parser_gimple_compound_statement (gimple_parser &, gimple_seq *);
static void c_parser_gimple_label (gimple_parser &, gimple_seq *);
static void c_parser_gimple_statement (gimple_parser &, gimple_seq *);
-static struct c_expr c_parser_gimple_binary_expression (gimple_parser &);
+static struct c_expr c_parser_gimple_binary_expression (gimple_parser &, tree);
static struct c_expr c_parser_gimple_unary_expression (gimple_parser &);
static struct c_expr c_parser_gimple_postfix_expression (gimple_parser &);
static struct c_expr c_parser_gimple_postfix_expression_after_primary
return;
}
- rhs = c_parser_gimple_binary_expression (parser);
+ rhs = c_parser_gimple_binary_expression (parser, TREE_TYPE (lhs.value));
if (lhs.value != error_mark_node
&& rhs.value != error_mark_node)
{
*/
static c_expr
-c_parser_gimple_binary_expression (gimple_parser &parser)
+c_parser_gimple_binary_expression (gimple_parser &parser, tree ret_type)
{
/* Location of the binary operator. */
struct c_expr ret, lhs, rhs;
lhs = c_parser_gimple_postfix_expression (parser);
if (c_parser_error (parser))
return ret;
- tree ret_type = TREE_TYPE (lhs.value);
switch (c_parser_peek_token (parser)->type)
{
case CPP_MULT:
code = PLUS_EXPR;
break;
case CPP_MINUS:
- code = MINUS_EXPR;
+ if (POINTER_TYPE_P (TREE_TYPE (lhs.value)))
+ code = POINTER_DIFF_EXPR;
+ else
+ code = MINUS_EXPR;
break;
case CPP_LSHIFT:
code = LSHIFT_EXPR;
break;
case CPP_LESS:
code = LT_EXPR;
- ret_type = boolean_type_node;
break;
case CPP_GREATER:
code = GT_EXPR;
- ret_type = boolean_type_node;
break;
case CPP_LESS_EQ:
code = LE_EXPR;
- ret_type = boolean_type_node;
break;
case CPP_GREATER_EQ:
code = GE_EXPR;
- ret_type = boolean_type_node;
break;
case CPP_EQ_EQ:
code = EQ_EXPR;
- ret_type = boolean_type_node;
break;
case CPP_NOT_EQ:
code = NE_EXPR;
- ret_type = boolean_type_node;
break;
case CPP_AND:
code = BIT_AND_EXPR;
c_parser_error (parser, "%<||%> not valid in GIMPLE");
return ret;
case CPP_NAME:
- {
- tree id = c_parser_peek_token (parser)->value;
- if (strcmp (IDENTIFIER_POINTER (id), "__MULT_HIGHPART") == 0)
- {
- code = MULT_HIGHPART_EXPR;
- break;
- }
- }
+ {
+ tree id = c_parser_peek_token (parser)->value;
+ if (strcmp (IDENTIFIER_POINTER (id), "__MULT_HIGHPART") == 0)
+ {
+ code = MULT_HIGHPART_EXPR;
+ break;
+ }
+ else if (strcmp (IDENTIFIER_POINTER (id), "__UNLT") == 0)
+ {
+ code = UNLT_EXPR;
+ break;
+ }
+ else if (strcmp (IDENTIFIER_POINTER (id), "__UNLE") == 0)
+ {
+ code = UNLE_EXPR;
+ break;
+ }
+ else if (strcmp (IDENTIFIER_POINTER (id), "__UNGT") == 0)
+ {
+ code = UNGT_EXPR;
+ break;
+ }
+ else if (strcmp (IDENTIFIER_POINTER (id), "__UNGE") == 0)
+ {
+ code = UNGE_EXPR;
+ break;
+ }
+ else if (strcmp (IDENTIFIER_POINTER (id), "__UNEQ") == 0)
+ {
+ code = UNEQ_EXPR;
+ break;
+ }
+ else if (strcmp (IDENTIFIER_POINTER (id), "__UNORDERED") == 0)
+ {
+ code = UNORDERED_EXPR;
+ break;
+ }
+ else if (strcmp (IDENTIFIER_POINTER (id), "__ORDERED") == 0)
+ {
+ code = ORDERED_EXPR;
+ break;
+ }
+ }
/* Fallthru. */
default:
/* Not a binary expression. */
{
if (! c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
return error_mark_node;
- tree cond = c_parser_gimple_binary_expression (parser).value;
+ tree cond
+ = c_parser_gimple_binary_expression (parser, boolean_type_node).value;
if (cond != error_mark_node
&& ! COMPARISON_CLASS_P (cond)
&& ! CONSTANT_CLASS_P (cond)