]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c/59846 (Imprecise column number for -Wtype-limits)
authorMarek Polacek <polacek@redhat.com>
Thu, 23 Jan 2014 21:01:08 +0000 (21:01 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Thu, 23 Jan 2014 21:01:08 +0000 (21:01 +0000)
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

gcc/c-family/ChangeLog
gcc/c-family/c-common.c
gcc/c-family/c-common.h
gcc/c/ChangeLog
gcc/c/c-typeck.c
gcc/cp/ChangeLog
gcc/cp/typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr59846.c [new file with mode: 0644]

index cba9f4e1484c63dde2192f9accf7e92e1b7f9b43..34c166041c079ef5a9a3c265e6bafb69d3d67f48 100644 (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
index 09128016ba46b85cc0b1443115c10a9bf0619451..86cec72a173804556df5250b5a0477310a84a4c9 100644 (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.  */
index dab0b8cd82147c52bed08fec48befa750792176b..d7077fd7f94522d987762e45aba56365c3a767fa 100644 (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);
index 4088912db61662cb9faf1f20fab4067b971dcb27..834c4202fe2f97365125cdc071c08775cba0a16c 100644 (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
index 77f3bddc469816cae6bb34db9c9be4adce315284..f71bea4abe652234a11e6a88ee0a3448d5390e02 100644 (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)
            {
index aee3fcf8a988128ebb681f53ed9f5a527d14b983..e6631700d18c1b27837fda3334dedb75233f438e 100644 (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
index 9cd6a95a7f11cdc7f1201075e62f3f579334d20b..f40f3095b38921ab0080426691f33f888c7ab142 100644 (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;
index f3d8d3a7caaeceb247a84a1365b3e1676d142136..47352e1d26e68f3dc46b56d06e2caebe39ba2f99 100644 (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
diff --git a/gcc/testsuite/gcc.dg/pr59846.c b/gcc/testsuite/gcc.dg/pr59846.c
new file mode 100644 (file)
index 0000000..e002fba
--- /dev/null
@@ -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" } */
+}