re PR c/59846 (Imprecise column number for -Wtype-limits)

PR c/59846
c-family/
	* c-common.c (shorten_compare): Add location_t parameter.
	* c-common.h (shorten_binary_op): Adjust declaration.
cp/
	* typeck.c (cp_build_binary_op): Pass location to shorten_compare.
c/
	* c-typeck.c (parser_build_binary_op): Use location instead of
	input_location.
	(build_binary_op): Pass location to shorten_compare.
testsuite/
	* gcc.dg/pr59846.c: New test.

From-SVN: r207008
This commit is contained in:
Marek Polacek 2014-01-23 21:01:08 +00:00 committed by Marek Polacek
parent 6e23f29678
commit 393e8e8b0c
9 changed files with 75 additions and 9 deletions

View file

@ -1,3 +1,9 @@
2014-01-23 Marek Polacek <polacek@redhat.com>
PR c/59846
* c-common.c (shorten_compare): Add location_t parameter.
* c-common.h (shorten_binary_op): Adjust declaration.
2014-01-23 Marek Polacek <polacek@redhat.com>
PR c/58346

View file

@ -3974,13 +3974,15 @@ expr_original_type (tree expr)
of build_binary_op: OP0_PTR is &OP0, OP1_PTR is &OP1,
RESTYPE_PTR is &RESULT_TYPE and RESCODE_PTR is &RESULTCODE.
LOC is the location of the comparison.
If this function returns nonzero, it means that the comparison has
a constant value. What this function returns is an expression for
that value. */
tree
shorten_compare (tree *op0_ptr, tree *op1_ptr, tree *restype_ptr,
enum tree_code *rescode_ptr)
shorten_compare (location_t loc, tree *op0_ptr, tree *op1_ptr,
tree *restype_ptr, enum tree_code *rescode_ptr)
{
tree type;
tree op0 = *op0_ptr;
@ -3989,7 +3991,6 @@ shorten_compare (tree *op0_ptr, tree *op1_ptr, tree *restype_ptr,
int real1, real2;
tree primop0, primop1;
enum tree_code code = *rescode_ptr;
location_t loc = EXPR_LOC_OR_LOC (op0, input_location);
/* Throw away any conversions to wider types
already present in the operands. */

View file

@ -800,7 +800,8 @@ extern tree shorten_binary_op (tree result_type, tree op0, tree op1, bool bitwis
/* Subroutine of build_binary_op, used for comparison operations.
See if the operands have both been converted from subword integer types
and, if so, perhaps change them both back to their original type. */
extern tree shorten_compare (tree *, tree *, tree *, enum tree_code *);
extern tree shorten_compare (location_t, tree *, tree *, tree *,
enum tree_code *);
extern tree pointer_int_sum (location_t, enum tree_code, tree, tree,
bool = true);

View file

@ -1,3 +1,10 @@
2014-01-23 Marek Polacek <polacek@redhat.com>
PR c/59846
* c-typeck.c (parser_build_binary_op): Use location instead of
input_location.
(build_binary_op): Pass location to shorten_compare.
2014-01-23 Marek Polacek <polacek@redhat.com>
PR c/58346

View file

@ -3388,11 +3388,11 @@ parser_build_binary_op (location_t location, enum tree_code code,
/* Check for cases such as x+y<<z which users are likely
to misinterpret. */
if (warn_parentheses)
warn_about_parentheses (input_location, code,
code1, arg1.value, code2, arg2.value);
warn_about_parentheses (location, code, code1, arg1.value, code2,
arg2.value);
if (warn_logical_op)
warn_logical_operator (input_location, code, TREE_TYPE (result.value),
warn_logical_operator (location, code, TREE_TYPE (result.value),
code1, arg1.value, code2, arg2.value);
/* Warn about comparisons against string literals, with the exception
@ -10891,7 +10891,8 @@ build_binary_op (location_t location, enum tree_code code,
tree xop0 = op0, xop1 = op1, xresult_type = result_type;
enum tree_code xresultcode = resultcode;
tree val
= shorten_compare (&xop0, &xop1, &xresult_type, &xresultcode);
= shorten_compare (location, &xop0, &xop1, &xresult_type,
&xresultcode);
if (val != 0)
{

View file

@ -1,3 +1,8 @@
2014-01-23 Marek Polacek <polacek@redhat.com>
PR c/59846
* typeck.c (cp_build_binary_op): Pass location to shorten_compare.
2014-01-23 Marek Polacek <polacek@redhat.com>
PR c/58346

View file

@ -4838,7 +4838,8 @@ cp_build_binary_op (location_t location,
tree xop0 = op0, xop1 = op1, xresult_type = result_type;
enum tree_code xresultcode = resultcode;
tree val
= shorten_compare (&xop0, &xop1, &xresult_type, &xresultcode);
= shorten_compare (location, &xop0, &xop1, &xresult_type,
&xresultcode);
if (val != 0)
return cp_convert (boolean_type_node, val, complain);
op0 = xop0, op1 = xop1;

View file

@ -1,3 +1,8 @@
2014-01-23 Marek Polacek <polacek@redhat.com>
PR c/59846
* gcc.dg/pr59846.c: New test.
2014-01-23 Marek Polacek <polacek@redhat.com>
PR c/58346

View file

@ -0,0 +1,39 @@
/* PR c/59846 */
/* { dg-do compile } */
/* { dg-options "-Wlogical-op -Wtype-limits" } */
_Bool
fn1 (unsigned int p)
{
return 0UL > p; /* { dg-warning "14:comparison is always false due to limited range of data type" } */
}
_Bool
fn2 (unsigned int p)
{
return 0UL <= p; /* { dg-warning "14:comparison is always true due to limited range of data type" } */
}
_Bool
fn3 (unsigned int p)
{
return p >= 0U; /* { dg-warning "12:comparison of unsigned expression >= 0 is always true" } */
}
_Bool
fn4 (unsigned int p)
{
return p < 0U; /* { dg-warning "12:comparison of unsigned expression < 0 is always false" } */
}
_Bool
fn5 (_Bool p)
{
return p || !p; /* { dg-warning "12:logical" } */
}
_Bool
fn6 (_Bool p)
{
return p && !p; /* { dg-warning "12:logical" } */
}