+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
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
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 "
|| (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]
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);
/* 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);
}
}
+ 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
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 {
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. */
+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
--- /dev/null
+/* { 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
+}
+
|| !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]))
{
}
}
- 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]))
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);
/* 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;