Fix location maybe_diag_overlap passes to diagnostics so that diagnostic pragmas...
authorJeff Law <law@redhat.com>
Thu, 5 Mar 2020 21:01:30 +0000 (14:01 -0700)
committerJeff Law <law@redhat.com>
Thu, 5 Mar 2020 21:01:30 +0000 (14:01 -0700)
PR tree-optimization/91890
* gimple-ssa-warn-restrict.c (maybe_diag_overlap): Remove LOC argument.
Use gimple_or_expr_nonartificial_location.
(check_bounds_overlap): Drop LOC argument to maybe_diag_access_bounds.
Use gimple_or_expr_nonartificial_location.
* gimple.c (gimple_or_expr_nonartificial_location): New function.
* gimple.h (gimple_or_expr_nonartificial_location): Declare it.
* tree-ssa-strlen.c (maybe_warn_overflow): Use
gimple_or_expr_nonartificial_location.
(maybe_diag_stxncpy_trunc, handle_builtin_stxncpy_strncat): Likewise.
(maybe_warn_pointless_strcmp): Likewise.

* gcc.dg/pragma-diag-8.c: New test.

gcc/ChangeLog
gcc/gimple-ssa-warn-restrict.c
gcc/gimple.c
gcc/gimple.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pragma-diag-8.c [new file with mode: 0644]
gcc/tree-ssa-strlen.c

index a20f8dcbd5d43cda08a5f630463f9ad2a47a491b..14e90fbd8b7961950364f2528b9a1991f37c3d16 100644 (file)
@@ -1,3 +1,17 @@
+2020-03-05  Jeff Law  <law@redhat.com>
+
+       PR tree-optimization/91890
+       * gimple-ssa-warn-restrict.c (maybe_diag_overlap): Remove LOC argument.
+       Use gimple_or_expr_nonartificial_location.
+       (check_bounds_overlap): Drop LOC argument to maybe_diag_access_bounds.
+       Use gimple_or_expr_nonartificial_location.
+       * gimple.c (gimple_or_expr_nonartificial_location): New function.
+       * gimple.h (gimple_or_expr_nonartificial_location): Declare it.
+       * tree-ssa-strlen.c (maybe_warn_overflow): Use
+       gimple_or_expr_nonartificial_location.
+       (maybe_diag_stxncpy_trunc, handle_builtin_stxncpy_strncat): Likewise.
+       (maybe_warn_pointless_strcmp): Likewise.
+
 2020-03-05  Jakub Jelinek  <jakub@redhat.com>
 
        PR target/94046
index 2c582a670eb23baa5602adf62d49e7bc10da7d85..5e7e5d41dbb44a5b26551dd92acbf808857b2429 100644 (file)
@@ -1692,10 +1692,11 @@ maybe_diag_overlap (location_t loc, gimple *call, builtin_access &acs)
    has been issued, or would have been issued if DO_WARN had been true.  */
 
 static bool
-maybe_diag_access_bounds (location_t loc, gimple *call, tree func, int strict,
+maybe_diag_access_bounds (gimple *call, tree func, int strict,
                          const builtin_memref &ref, offset_int wroff,
                          bool do_warn)
 {
+  location_t loc = gimple_or_expr_nonartificial_location (call, ref.ptr);
   const offset_int maxobjsize = ref.maxobjsize;
 
   /* Check for excessive size first and regardless of warning options
@@ -1711,11 +1712,6 @@ maybe_diag_access_bounds (location_t loc, gimple *call, tree func, int strict,
 
       if (warn_stringop_overflow)
        {
-         if (EXPR_HAS_LOCATION (ref.ptr))
-           loc = EXPR_LOCATION (ref.ptr);
-
-         loc = expansion_point_location_if_in_system_header (loc);
-
          if (ref.sizrange[0] == ref.sizrange[1])
            return warning_at (loc, OPT_Wstringop_overflow_,
                               "%G%qD specified bound %wu "
@@ -1754,11 +1750,6 @@ maybe_diag_access_bounds (location_t loc, gimple *call, tree func, int strict,
       || (ref.ref && TREE_NO_WARNING (ref.ref)))
     return false;
 
-  if (EXPR_HAS_LOCATION (ref.ptr))
-    loc = EXPR_LOCATION (ref.ptr);
-
-  loc = expansion_point_location_if_in_system_header (loc);
-
   char rangestr[2][64];
   if (ooboff[0] == ooboff[1]
       || (ooboff[0] != ref.offrange[0]
@@ -2018,9 +2009,6 @@ check_bounds_or_overlap (gimple *call, tree dst, tree src, tree dstsize,
                         tree srcsize, bool bounds_only /* = false */,
                         bool do_warn /* = true */)
 {
-  location_t loc = gimple_nonartificial_location (call);
-  loc = expansion_point_location_if_in_system_header (loc);
-
   tree func = gimple_call_fndecl (call);
 
   builtin_memref dstref (dst, dstsize);
@@ -2041,8 +2029,8 @@ check_bounds_or_overlap (gimple *call, tree dst, tree src, tree dstsize,
   /* Validate offsets to each reference before the access first to make
      sure they are within the bounds of the destination object if its
      size is known, or PTRDIFF_MAX otherwise.  */
-  if (maybe_diag_access_bounds (loc, call, func, strict, dstref, wroff, do_warn)
-      || maybe_diag_access_bounds (loc, call, func, strict, srcref, 0, do_warn))
+  if (maybe_diag_access_bounds (call, func, strict, dstref, wroff, do_warn)
+      || maybe_diag_access_bounds (call, func, strict, srcref, 0, do_warn))
     {
       if (do_warn)
        gimple_set_no_warning (call, true);
@@ -2066,6 +2054,7 @@ check_bounds_or_overlap (gimple *call, tree dst, tree src, tree dstsize,
        }
     }
 
+  location_t loc = gimple_or_expr_nonartificial_location (call, dst);
   if (operand_equal_p (dst, src, 0))
     {
       /* Issue -Wrestrict unless the pointers are null (those do
index 324e706d508e43f6cb3c03b01b00fa8204fea5b2..92c6e6425897c06f33c83795b10207cd92dfd15c 100644 (file)
@@ -3285,6 +3285,19 @@ gimple_inexpensive_call_p (gcall *stmt)
   return false;
 }
 
+/* Return a non-artificial location for STMT.  If STMT does not have
+   location information, get the location from EXPR.  */
+
+location_t
+gimple_or_expr_nonartificial_location (gimple *stmt, tree)
+{
+  location_t loc = gimple_nonartificial_location (stmt);
+  if (loc == UNKNOWN_LOCATION && EXPR_HAS_LOCATION (expr))
+    loc = tree_nonartificial_location (expr);
+  return expansion_point_location_if_in_system_header (loc);
+}
+
+
 #if CHECKING_P
 
 namespace selftest {
index 192f19ad23ab8fee8ff6f73087de98c39f11ced0..0420d6d2251f7df02c45e5296a93fcc28b2629e9 100644 (file)
@@ -1633,6 +1633,8 @@ extern void gimple_seq_discard (gimple_seq);
 extern void maybe_remove_unused_call_args (struct function *, gimple *);
 extern bool gimple_inexpensive_call_p (gcall *);
 extern bool stmt_can_terminate_bb_p (gimple *);
+extern location_t gimple_or_expr_nonartificial_location (gimple *, tree);
+
 
 /* Formal (expression) temporary table handling: multiple occurrences of
    the same scalar expression are evaluated into the same temporary.  */
index 169cedea81bc576eb2642e1c00d3a3c013154743..36c87d68e5671215031cf5aada40e62ff052ba27 100644 (file)
@@ -1,3 +1,8 @@
+2020-03-05  Jeff Law  <law@redhat.com>
+
+       PR tree-optimization/91890
+       * gcc.dg/pragma-diag-8.c: New test.
+
 2020-03-05  Jakub Jelinek  <jakub@redhat.com>
 
        PR target/94046
diff --git a/gcc/testsuite/gcc.dg/pragma-diag-8.c b/gcc/testsuite/gcc.dg/pragma-diag-8.c
new file mode 100644 (file)
index 0000000..0078060
--- /dev/null
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -Wall" } */
+
+
+char one[50];
+char two[50];
+
+void
+test_strncat (void)
+{
+  (void) __builtin_strcpy (one, "gh");
+  (void) __builtin_strcpy (two, "ef");
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wstringop-overflow="
+#pragma GCC diagnostic ignored "-Warray-bounds"
+  (void) __builtin_strncat (one, two, 99); 
+#pragma GCC diagnostic pop
+}
+
index 81be11de797123d9db0702b5e2535fce4ebb4823..8815cdbc9ca3c644a600d16a2406e14d861e0866 100644 (file)
@@ -2129,11 +2129,7 @@ maybe_warn_overflow (gimple *stmt, tree len,
          || !si || !is_strlen_related_p (si->ptr, len)))
     return;
 
-  location_t loc = gimple_nonartificial_location (stmt);
-  if (loc == UNKNOWN_LOCATION && dest && EXPR_HAS_LOCATION (dest))
-    loc = tree_nonartificial_location (dest);
-  loc = expansion_point_location_if_in_system_header (loc);
-
+  location_t loc = gimple_or_expr_nonartificial_location (stmt, dest);
   bool warned = false;
   if (wi::leu_p (lenrng[0], spcrng[1]))
     {
@@ -3189,9 +3185,7 @@ maybe_diag_stxncpy_trunc (gimple_stmt_iterator gsi, tree src, tree cnt)
        }
     }
 
-  location_t callloc = gimple_nonartificial_location (stmt);
-  callloc = expansion_point_location_if_in_system_header (callloc);
-
+  location_t callloc = gimple_or_expr_nonartificial_location (stmt, dst);
   tree func = gimple_call_fndecl (stmt);
 
   if (lenrange[0] != 0 || !wi::neg_p (lenrange[1]))
@@ -3403,8 +3397,7 @@ handle_builtin_stxncpy_strncat (bool append_p, gimple_stmt_iterator *gsi)
      to strlen(S)).  */
   strinfo *silen = get_strinfo (pss->first);
 
-  location_t callloc = gimple_nonartificial_location (stmt);
-  callloc = expansion_point_location_if_in_system_header (callloc);
+  location_t callloc = gimple_or_expr_nonartificial_location (stmt, dst);
 
   tree func = gimple_call_fndecl (stmt);
 
@@ -4331,10 +4324,7 @@ maybe_warn_pointless_strcmp (gimple *stmt, HOST_WIDE_INT bound,
 
   /* FIXME: Include a note pointing to the declaration of the smaller
      array.  */
-  location_t stmt_loc = gimple_nonartificial_location (stmt);
-  if (stmt_loc == UNKNOWN_LOCATION && EXPR_HAS_LOCATION (lhs))
-    stmt_loc = tree_nonartificial_location (lhs);
-  stmt_loc = expansion_point_location_if_in_system_header (stmt_loc);
+  location_t stmt_loc = gimple_or_expr_nonartificial_location (stmt, lhs);
 
   tree callee = gimple_call_fndecl (stmt);
   bool warned = false;