diff options
author | Andrew Pinski <apinski@marvell.com> | 2023-03-01 11:13:21 -0800 |
---|---|---|
committer | Andrew Pinski <apinski@marvell.com> | 2023-03-09 18:28:09 +0000 |
commit | c6232ba229a4fcd453b50f11351fcbd35296809c (patch) | |
tree | 90c72caae0dbac71dfaeb51073a545c3668594ac /gcc/gimple-array-bounds.cc | |
parent | 3df9760d56662bdf38dd45f7398f003bbd64fdfe (diff) | |
download | gcc-c6232ba229a4fcd453b50f11351fcbd35296809c.zip gcc-c6232ba229a4fcd453b50f11351fcbd35296809c.tar.gz gcc-c6232ba229a4fcd453b50f11351fcbd35296809c.tar.bz2 |
Fix PR 108980: note without warning due to array bounds check
The problem here is after r13-4748-g2a27ae32fabf85, in some
cases we were calling inform without a corresponding warning.
This changes the logic such that we only cause that to happen
if there was a warning happened before hand.
Changes since
* v1: Fix formating and dump message as suggested by Jakub.
OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions.
gcc/ChangeLog:
PR tree-optimization/108980
* gimple-array-bounds.cc (array_bounds_checker::check_array_ref):
Reorgnize the call to warning for not strict flexible arrays
to be before the check of warned.
Diffstat (limited to 'gcc/gimple-array-bounds.cc')
-rw-r--r-- | gcc/gimple-array-bounds.cc | 41 |
1 files changed, 26 insertions, 15 deletions
diff --git a/gcc/gimple-array-bounds.cc b/gcc/gimple-array-bounds.cc index 66fd46e..34e039a 100644 --- a/gcc/gimple-array-bounds.cc +++ b/gcc/gimple-array-bounds.cc @@ -397,27 +397,38 @@ array_bounds_checker::check_array_ref (location_t location, tree ref, "of an interior zero-length array %qT")), low_sub, artype); - if (warned || out_of_bound) + if (warned && dump_file && (dump_flags & TDF_DETAILS)) { - if (warned && dump_file && (dump_flags & TDF_DETAILS)) + fprintf (dump_file, "Array bound warning for "); + dump_generic_expr (MSG_NOTE, TDF_SLIM, ref); + fprintf (dump_file, "\n"); + } + + /* Issue warnings for -Wstrict-flex-arrays according to the level of + flag_strict_flex_arrays. */ + if (out_of_bound && warn_strict_flex_arrays + && (sam == special_array_member::trail_0 + || sam == special_array_member::trail_1 + || sam == special_array_member::trail_n) + && DECL_NOT_FLEXARRAY (afield_decl)) + { + bool warned1 + = warning_at (location, OPT_Wstrict_flex_arrays, + "trailing array %qT should not be used as " + "a flexible array member", + artype); + + if (warned1 && dump_file && (dump_flags & TDF_DETAILS)) { - fprintf (dump_file, "Array bound warning for "); + fprintf (dump_file, "Trailing non flexible-like array bound warning for "); dump_generic_expr (MSG_NOTE, TDF_SLIM, ref); fprintf (dump_file, "\n"); } + warned |= warned1; + } - /* issue warnings for -Wstrict-flex-arrays according to the level of - flag_strict_flex_arrays. */ - if ((out_of_bound && warn_strict_flex_arrays) - && (((sam == special_array_member::trail_0) - || (sam == special_array_member::trail_1) - || (sam == special_array_member::trail_n)) - && DECL_NOT_FLEXARRAY (afield_decl))) - warned = warning_at (location, OPT_Wstrict_flex_arrays, - "trailing array %qT should not be used as " - "a flexible array member", - artype); - + if (warned) + { /* Avoid more warnings when checking more significant subscripts of the same expression. */ ref = TREE_OPERAND (ref, 0); |