aboutsummaryrefslogtreecommitdiff
path: root/gcc/gimple-array-bounds.cc
diff options
context:
space:
mode:
authorIskander Shakirzyanov <iskander@ispras.ru>2022-11-24 14:26:59 +0000
committerAlexander Monakov <amonakov@ispras.ru>2022-11-30 16:30:48 +0300
commit7c01d029fca669263b9c2dcb8837c42f7ae3a77f (patch)
tree7990b3eae36ff8a67c01bc63050152b59ae671e3 /gcc/gimple-array-bounds.cc
parent4fa25a7eb322f0a003c1eb15680c71ece345e01e (diff)
downloadgcc-7c01d029fca669263b9c2dcb8837c42f7ae3a77f.zip
gcc-7c01d029fca669263b9c2dcb8837c42f7ae3a77f.tar.gz
gcc-7c01d029fca669263b9c2dcb8837c42f7ae3a77f.tar.bz2
Make Warray-bounds alias to Warray-bounds= [PR107787]
According to the documentation, the -Werror= option makes the specified warning into an error and also automatically implies that option. Then it seems that the behavior of the compiler when specifying -Werror=array-bounds=X should be the same as specifying "-Werror=array-bounds -Warray-bounds=X", so we expect to receive array-bounds pass diagnostics and they must be processed as errors. In practice, we observe that the array-bounds pass is indeed invoked, but its diagnostics are processed as warnings, not errors. This happens because Warray-bounds and Warray-bounds= are declared as two different options in common.opt, so when diagnostic_classify_diagnostic is called, DK_ERROR is set for the Warray-bounds= option, but diagnostic_report_diagnostic called from warning_at receives opt_index of Warray-bounds, so information about DK_ERROR is lost. Fix this by using Alias in declaration of Warray-bounds (similar to Wattribute-alias). Co-authored-by: Franz Sirl <Franz.Sirl-kernel@lauterbach.com> gcc/ChangeLog: PR driver/107787 * common.opt (Warray-bounds): Turn into alias of -Warray-bounds=1. * builtins.cc (c_strlen): Use OPT_Warray_bounds_ instead of OPT_Warray_bounds. * diagnostic-spec.cc (nowarn_spec_t::nowarn_spec_t): Ditto. * gimple-array-bounds.cc (array_bounds_checker::check_array_ref, array_bounds_checker::check_mem_ref, array_bounds_checker::check_addr_expr, array_bounds_checker::check_array_bounds): Ditto. * gimple-ssa-warn-restrict.cc (maybe_diag_access_bounds): Ditto. gcc/c-family/ChangeLog: PR driver/107787 * c-common.cc (fold_offsetof, convert_vector_to_array_for_subscript): Use OPT_Warray_bounds_ instead of OPT_Warray_bounds. gcc/testsuite/ChangeLog: PR driver/107787 * gcc.dg/Warray-bounds-34.c: Correct the regular expression for -Warray-bounds=. * gcc.dg/Warray-bounds-43.c: Likewise. * gcc.dg/pr107787.c: New test.
Diffstat (limited to 'gcc/gimple-array-bounds.cc')
-rw-r--r--gcc/gimple-array-bounds.cc38
1 files changed, 19 insertions, 19 deletions
diff --git a/gcc/gimple-array-bounds.cc b/gcc/gimple-array-bounds.cc
index eae49ab..972e25f 100644
--- a/gcc/gimple-array-bounds.cc
+++ b/gcc/gimple-array-bounds.cc
@@ -172,7 +172,7 @@ bool
array_bounds_checker::check_array_ref (location_t location, tree ref,
gimple *stmt, bool ignore_off_by_one)
{
- if (warning_suppressed_p (ref, OPT_Warray_bounds))
+ if (warning_suppressed_p (ref, OPT_Warray_bounds_))
/* Return true to have the caller prevent warnings for enclosing
refs. */
return true;
@@ -277,7 +277,7 @@ array_bounds_checker::check_array_ref (location_t location, tree ref,
/* Empty array. */
if (up_bound && tree_int_cst_equal (low_bound, up_bound_p1))
- warned = warning_at (location, OPT_Warray_bounds,
+ warned = warning_at (location, OPT_Warray_bounds_,
"array subscript %E is outside array bounds of %qT",
low_sub, artype);
@@ -303,7 +303,7 @@ array_bounds_checker::check_array_ref (location_t location, tree ref,
: tree_int_cst_le (up_bound, up_sub))
&& TREE_CODE (low_sub) == INTEGER_CST
&& tree_int_cst_le (low_sub, low_bound))
- warned = warning_at (location, OPT_Warray_bounds,
+ warned = warning_at (location, OPT_Warray_bounds_,
"array subscript [%E, %E] is outside "
"array bounds of %qT",
low_sub, up_sub, artype);
@@ -313,12 +313,12 @@ array_bounds_checker::check_array_ref (location_t location, tree ref,
&& (ignore_off_by_one
? !tree_int_cst_le (up_sub, up_bound_p1)
: !tree_int_cst_le (up_sub, up_bound)))
- warned = warning_at (location, OPT_Warray_bounds,
+ warned = warning_at (location, OPT_Warray_bounds_,
"array subscript %E is above array bounds of %qT",
up_sub, artype);
else if (TREE_CODE (low_sub) == INTEGER_CST
&& tree_int_cst_lt (low_sub, low_bound))
- warned = warning_at (location, OPT_Warray_bounds,
+ warned = warning_at (location, OPT_Warray_bounds_,
"array subscript %E is below array bounds of %qT",
low_sub, artype);
@@ -343,7 +343,7 @@ array_bounds_checker::check_array_ref (location_t location, tree ref,
/* Avoid more warnings when checking more significant subscripts
of the same expression. */
ref = TREE_OPERAND (ref, 0);
- suppress_warning (ref, OPT_Warray_bounds);
+ suppress_warning (ref, OPT_Warray_bounds_);
if (decl)
ref = decl;
@@ -383,7 +383,7 @@ bool
array_bounds_checker::check_mem_ref (location_t location, tree ref,
bool ignore_off_by_one)
{
- if (warning_suppressed_p (ref, OPT_Warray_bounds))
+ if (warning_suppressed_p (ref, OPT_Warray_bounds_))
return false;
/* The statement used to allocate the array or null. */
@@ -483,12 +483,12 @@ array_bounds_checker::check_mem_ref (location_t location, tree ref,
if (lboob)
{
if (offrange[0] == offrange[1])
- warned = warning_at (location, OPT_Warray_bounds,
+ warned = warning_at (location, OPT_Warray_bounds_,
"array subscript %wi is outside array bounds "
"of %qT",
offrange[0].to_shwi (), reftype);
else
- warned = warning_at (location, OPT_Warray_bounds,
+ warned = warning_at (location, OPT_Warray_bounds_,
"array subscript [%wi, %wi] is outside "
"array bounds of %qT",
offrange[0].to_shwi (),
@@ -503,7 +503,7 @@ array_bounds_checker::check_mem_ref (location_t location, tree ref,
backtype = build_array_type_nelts (unsigned_char_type_node,
aref.sizrng[1].to_uhwi ());
- warned = warning_at (location, OPT_Warray_bounds,
+ warned = warning_at (location, OPT_Warray_bounds_,
"array subscript %<%T[%wi]%> is partly "
"outside array bounds of %qT",
axstype, offrange[0].to_shwi (), backtype);
@@ -513,7 +513,7 @@ array_bounds_checker::check_mem_ref (location_t location, tree ref,
{
/* TODO: Determine the access from the statement and use it. */
aref.inform_access (access_none);
- suppress_warning (ref, OPT_Warray_bounds);
+ suppress_warning (ref, OPT_Warray_bounds_);
return true;
}
@@ -526,11 +526,11 @@ array_bounds_checker::check_mem_ref (location_t location, tree ref,
{
HOST_WIDE_INT tmpidx = (aref.offmax[i] / eltsize).to_shwi ();
- if (warning_at (location, OPT_Warray_bounds,
+ if (warning_at (location, OPT_Warray_bounds_,
"intermediate array offset %wi is outside array bounds "
"of %qT", tmpidx, reftype))
{
- suppress_warning (ref, OPT_Warray_bounds);
+ suppress_warning (ref, OPT_Warray_bounds_);
return true;
}
}
@@ -562,7 +562,7 @@ array_bounds_checker::check_addr_expr (location_t location, tree t,
warned = check_mem_ref (location, t, ignore_off_by_one);
if (warned)
- suppress_warning (t, OPT_Warray_bounds);
+ suppress_warning (t, OPT_Warray_bounds_);
t = TREE_OPERAND (t, 0);
}
@@ -570,7 +570,7 @@ array_bounds_checker::check_addr_expr (location_t location, tree t,
if (TREE_CODE (t) != MEM_REF
|| TREE_CODE (TREE_OPERAND (t, 0)) != ADDR_EXPR
- || warning_suppressed_p (t, OPT_Warray_bounds))
+ || warning_suppressed_p (t, OPT_Warray_bounds_))
return;
tree tem = TREE_OPERAND (TREE_OPERAND (t, 0), 0);
@@ -605,7 +605,7 @@ array_bounds_checker::check_addr_expr (location_t location, tree t,
dump_generic_expr (MSG_NOTE, TDF_SLIM, t);
fprintf (dump_file, "\n");
}
- warned = warning_at (location, OPT_Warray_bounds,
+ warned = warning_at (location, OPT_Warray_bounds_,
"array subscript %wi is below "
"array bounds of %qT",
idx.to_shwi (), TREE_TYPE (tem));
@@ -619,7 +619,7 @@ array_bounds_checker::check_addr_expr (location_t location, tree t,
dump_generic_expr (MSG_NOTE, TDF_SLIM, t);
fprintf (dump_file, "\n");
}
- warned = warning_at (location, OPT_Warray_bounds,
+ warned = warning_at (location, OPT_Warray_bounds_,
"array subscript %wu is above "
"array bounds of %qT",
idx.to_uhwi (), TREE_TYPE (tem));
@@ -630,7 +630,7 @@ array_bounds_checker::check_addr_expr (location_t location, tree t,
if (DECL_P (t))
inform (DECL_SOURCE_LOCATION (t), "while referencing %qD", t);
- suppress_warning (t, OPT_Warray_bounds);
+ suppress_warning (t, OPT_Warray_bounds_);
}
}
@@ -730,7 +730,7 @@ array_bounds_checker::check_array_bounds (tree *tp, int *walk_subtree,
/* Propagate the no-warning bit to the outer statement to avoid also
issuing -Wstringop-overflow/-overread for the out-of-bounds accesses. */
if (warned)
- suppress_warning (wi->stmt, OPT_Warray_bounds);
+ suppress_warning (wi->stmt, OPT_Warray_bounds_);
return NULL_TREE;
}