expr.c (struct op): Add location.

2008-10-31  Manuel López-Ibáñez  <manu@gcc.gnu.org>

libcpp/
	* expr.c (struct op): Add location.
	(_cpp_parse_expr): Propagate locations throught the stack
	of expressions.
	(reduce): Likewise.
	(check_promotion): Use explicit location in errors.
	
testsuite/
	* gcc.dg/cpp/Wsignprom.c: Add column numbers.
	* gcc.dg/cpp/if-mpar.c: Likewise.

From-SVN: r141503
This commit is contained in:
Manuel López-Ibáñez 2008-10-31 22:00:37 +00:00
parent 4f48b9c1a5
commit 47960aaf16
5 changed files with 59 additions and 21 deletions

View File

@ -1,3 +1,8 @@
2008-10-31 Manuel López-Ibáñez <manu@gcc.gnu.org>
* gcc.dg/cpp/Wsignprom.c: Add column numbers.
* gcc.dg/cpp/if-mpar.c: Likewise.
2008-10-31 Jakub Jelinek <jakub@redhat.com>
PR c++/37967

View File

@ -1,26 +1,26 @@
/* { dg-do preprocess } */
/* { dg-options "-Wall" } */
/* { dg-options "-Wall -fshow-column" } */
/* Test that -Wall emits the warnings about integer promotion changing
the sign of an operand. */
#if -1 > 0U /* { dg-warning "changes sign when promoted" } */
#if -1 > 0U /* { dg-warning "5:changes sign when promoted" } */
#endif
#if 0U + -1 /* { dg-warning "changes sign when promoted" } */
#if 0U + -1 /* { dg-warning "10:changes sign when promoted" } */
#endif
#if 0U * -1 /* { dg-warning "changes sign when promoted" } */
#if 0U * -1 /* { dg-warning "10:changes sign when promoted" } */
#endif
#if 1U / -2 /* { dg-warning "changes sign when promoted" } */
#if 1U / -2 /* { dg-warning "10:changes sign when promoted" } */
#endif
#if -1 % 1U /* { dg-warning "changes sign when promoted" } */
#if -1 % 1U /* { dg-warning "5:changes sign when promoted" } */
#endif
#if 1 ? 0U : -1 /* { dg-warning "changes sign when promoted" } */
#if 1 ? 0U : -1 /* { dg-warning "14:changes sign when promoted" } */
#endif
#if 1 ? -1 : 0U /* { dg-warning "changes sign when promoted" } */
#if 1 ? -1 : 0U /* { dg-warning "9:changes sign when promoted" } */
#endif

View File

@ -4,21 +4,27 @@
missing parenthesis message. */
/* { dg-do preprocess } */
#if (1 /* { dg-error "missing '\\)'" "missing ')' no. 1" } */
/* { dg-options "-fshow-column" } */
#if (1 /* { dg-error "5:missing '\\)'" "missing ')' no. 1" } */
#endif
#if 2 * (3 + 4 /* { dg-error "missing '\\)'" "missing ')' no. 2" } */
#if 2 * (3 + 4 /* { dg-error "9:missing '\\)'" "missing ')' no. 2" } */
#endif
#if (2)) /* { dg-error "missing '\\('" "missing '(' no. 1" } */
#if (2)) /* { dg-error "8:missing '\\('" "missing '(' no. 1" } */
#endif
#if ) /* { dg-error "missing '\\('" "missing '(' no. 2" } */
#if ) /* { dg-error "5:missing '\\('" "missing '(' no. 2" } */
#endif
#if 4) /* { dg-error "missing '\\('" "missing '(' no. 3" } */
#if 4) /* { dg-error "6:missing '\\('" "missing '(' no. 3" } */
#endif
#if ( /* { dg-error "missing '\\)'" "missing ')' no. 3" } */
#if ( /* { dg-error "5:missing '\\)'" "missing ')' no. 3" } */
#endif
#if ((2 + 3) + 5 /* { dg-error "5:missing '\\)'" "missing ')' no. 3" } */
#endif
#if ((2 + 3 + 5 /* { dg-error "6:missing '\\)'" "missing ')' no. 3" } */
#endif

View File

@ -1,3 +1,11 @@
2008-10-31 Manuel López-Ibáñez <manu@gcc.gnu.org>
* expr.c (struct op): Add location.
(_cpp_parse_expr): Propagate locations throught the stack
of expressions.
(reduce): Likewise.
(check_promotion): Use explicit location in errors.
2008-10-05 Matthew Gingell <gingell@adacore.com>
Arnaud Charlet <charlet@adacore.com>

View File

@ -32,6 +32,7 @@ struct op
{
const cpp_token *token; /* The token forming op (for diagnostics). */
cpp_num value; /* The value logically "right" of op. */
source_location loc; /* The location of this value. */
enum cpp_ttype op;
};
@ -875,6 +876,7 @@ _cpp_parse_expr (cpp_reader *pfile, bool is_if)
lex_count++;
op.token = cpp_get_token (pfile);
op.op = op.token->type;
op.loc = op.token->src_loc;
switch (op.op)
{
@ -978,6 +980,7 @@ _cpp_parse_expr (cpp_reader *pfile, bool is_if)
top->op = op.op;
top->token = op.token;
top->loc = op.token->src_loc;
}
/* The controlling macro expression is only valid if we called lex 3
@ -1031,6 +1034,7 @@ reduce (cpp_reader *pfile, struct op *top, enum cpp_ttype op)
case CPP_NOT:
case CPP_COMPL:
top[-1].value = num_unary_op (pfile, top->value, top->op);
top[-1].loc = top->loc;
break;
case CPP_PLUS:
@ -1040,6 +1044,7 @@ reduce (cpp_reader *pfile, struct op *top, enum cpp_ttype op)
case CPP_COMMA:
top[-1].value = num_binary_op (pfile, top[-1].value,
top->value, top->op);
top[-1].loc = top->loc;
break;
case CPP_GREATER:
@ -1048,12 +1053,14 @@ reduce (cpp_reader *pfile, struct op *top, enum cpp_ttype op)
case CPP_LESS_EQ:
top[-1].value
= num_inequality_op (pfile, top[-1].value, top->value, top->op);
top[-1].loc = top->loc;
break;
case CPP_EQ_EQ:
case CPP_NOT_EQ:
top[-1].value
= num_equality_op (pfile, top[-1].value, top->value, top->op);
top[-1].loc = top->loc;
break;
case CPP_AND:
@ -1061,16 +1068,19 @@ reduce (cpp_reader *pfile, struct op *top, enum cpp_ttype op)
case CPP_XOR:
top[-1].value
= num_bitwise_op (pfile, top[-1].value, top->value, top->op);
top[-1].loc = top->loc;
break;
case CPP_MULT:
top[-1].value = num_mul (pfile, top[-1].value, top->value);
top[-1].loc = top->loc;
break;
case CPP_DIV:
case CPP_MOD:
top[-1].value = num_div_op (pfile, top[-1].value,
top->value, top->op);
top[-1].loc = top->loc;
break;
case CPP_OR_OR:
@ -1082,6 +1092,7 @@ reduce (cpp_reader *pfile, struct op *top, enum cpp_ttype op)
top->value.high = 0;
top->value.unsignedp = false;
top->value.overflow = false;
top->loc = top[1].loc;
continue;
case CPP_AND_AND:
@ -1093,16 +1104,20 @@ reduce (cpp_reader *pfile, struct op *top, enum cpp_ttype op)
top->value.high = 0;
top->value.unsignedp = false;
top->value.overflow = false;
top->loc = top[1].loc;
continue;
case CPP_OPEN_PAREN:
if (op != CPP_CLOSE_PAREN)
{
cpp_error (pfile, CPP_DL_ERROR, "missing ')' in expression");
cpp_error_with_line (pfile, CPP_DL_ERROR,
top->token->src_loc,
0, "missing ')' in expression");
return 0;
}
top--;
top->value = top[1].value;
top->loc = top[1].loc;
return top;
case CPP_COLON:
@ -1111,9 +1126,13 @@ reduce (cpp_reader *pfile, struct op *top, enum cpp_ttype op)
{
pfile->state.skip_eval--;
top->value = top[1].value;
top->loc = top[1].loc;
}
else
top->value = top[2].value;
{
top->value = top[2].value;
top->loc = top[2].loc;
}
top->value.unsignedp = (top[1].value.unsignedp
|| top[2].value.unsignedp);
continue;
@ -1168,12 +1187,12 @@ check_promotion (cpp_reader *pfile, const struct op *op)
if (op->value.unsignedp)
{
if (!num_positive (op[-1].value, CPP_OPTION (pfile, precision)))
cpp_error (pfile, CPP_DL_WARNING,
"the left operand of \"%s\" changes sign when promoted",
cpp_token_as_text (pfile, op->token));
cpp_error_with_line (pfile, CPP_DL_WARNING, op[-1].loc, 0,
"the left operand of \"%s\" changes sign when promoted",
cpp_token_as_text (pfile, op->token));
}
else if (!num_positive (op->value, CPP_OPTION (pfile, precision)))
cpp_error (pfile, CPP_DL_WARNING,
cpp_error_with_line (pfile, CPP_DL_WARNING, op->loc, 0,
"the right operand of \"%s\" changes sign when promoted",
cpp_token_as_text (pfile, op->token));
}