On 08/20/2014 04:02 PM, Marek Polacek wrote:
On Wed, Aug 20, 2014 at 02:36:21PM -0400, Jason Merrill wrote:
Could we set current.lhs_type to TRUTH_NOT_EXPR when we see a ! rather than
track nots in two separate local variables?
Good point. So like the following?
I was thinking to do away with parenthesized_not_lhs_warn as well, so
instead of
bool parenthesized_not_lhs_warn
= cp_lexer_next_token_is (parser->lexer, CPP_NOT);
/* Parse the first expression. */
current.lhs = cp_parser_cast_expression (parser, /*address_p=*/false,
cast_p, decltype_p, pidk);
current.lhs_type = ERROR_MARK;
we would set current.lhs_type to TRUTH_NOT_EXPR here if the first token
is CPP_NOT, and
/* Extract another operand. It may be the RHS of this expression
or the LHS of a new, higher priority expression. */
rhs = cp_parser_simple_cast_expression (parser);
rhs_type = ERROR_MARK;
here we would do the same thing for rhs_type.
cp_lexer_consume_token (parser->lexer);
+ if (cp_lexer_next_token_is (parser->lexer, CPP_NOT))
+ current.lhs_type = TRUTH_NOT_EXPR;
...
current.lhs = rhs;
+ parenthesized_not_lhs_warn = current.lhs_type == TRUTH_NOT_EXPR;
current.lhs_type = rhs_type;
and then you don't need any changes in these places.
if (warn_logical_not_paren
&& parenthesized_not_lhs_warn)
And here you check current.lhs_type.
Jason