https://gcc.gnu.org/g:07a14a490b8f57dfe2a5b853fb4b88e9e124a92b
commit r16-238-g07a14a490b8f57dfe2a5b853fb4b88e9e124a92b Author: Andrew Pinski <quic_apin...@quicinc.com> Date: Sat Apr 5 04:47:59 2025 -0700 Add testcase for bogus Warray-bounds warning dealing with __builtin_unreachable [PR100038] After EVRP was switched to the ranger (r12-2305-g398572c1544d8b), we are better handling the case where __builtin_unreachable comes after a loop. Instead of removing __builtin_unreachable and having the loop become an infinite one; it is kept around longer and allows GCC to unroll the loop 2 times instead of 3 times. When GCC unrolled the loop 3 times, GCC would produce a bogus Warray-bounds warning for the 3rd iteration. This adds the testcase to make sure we don't regress on this case. It is originally extracted from LLVM source code too. PR tree-optimization/100038 gcc/testsuite/ChangeLog: * g++.dg/tree-ssa/pr100038.C: New test. Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com> Diff: --- gcc/testsuite/g++.dg/tree-ssa/pr100038.C | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr100038.C b/gcc/testsuite/g++.dg/tree-ssa/pr100038.C new file mode 100644 index 000000000000..7024c4db2b21 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr100038.C @@ -0,0 +1,17 @@ +// { dg-do compile } +// { dg-options "-O2 -Wextra -Wall -Warray-bounds" } + +struct SparseBitVectorElement { + long Bits[2]; + int find_first() const; +}; + +// we should not get an `array subscript 2 is above array bounds of` +// warning here because we have an unreachable at that point + +int SparseBitVectorElement::find_first() const { + for (unsigned i = 0; i < 2; ++i) + if (Bits[i]) // { dg-bogus "is above array bounds of" } + return i; + __builtin_unreachable(); +}