https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119592
Bug ID: 119592
Summary: Error "array subscript [...] is partly outside array
bounds of [...]"
Product: gcc
Version: 13.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: sandberg.sven at gmail dot com
Target Milestone: ---
gcc 13.1 and up reports a spurious error "array subscript [...] is partly
outside array bounds of [...]" for this code: https://godbolt.org/z/f3M143a1e
The error is spurious because it occurs only when it inlines line 20, but line
20 cannot be reached since m_always_true is initialized to true and never
altered.
Command line: `gcc -std=c++20 -Werror=array-bounds=1 -O2`
Code:
```
#include <iostream>
#include <set>
using Set1 = std::set<int>;
using Set2 = std::set<Set1>;
using Iter1 = Set1::const_iterator;
using Iter2 = Set2::const_iterator;
struct Iter_pair {
Iter2 m_iter2{};
Iter1 m_iter1{};
bool m_always_true{true};
Iter_pair(const Iter2 &iter2) : m_iter2(iter2), m_always_true(true) {}
bool set_iter1_if_true_is_false(Iter_pair &other) {
if (m_always_true && other.m_always_true) return true;
// not reached
m_iter1 = m_iter2->begin();
other.m_iter1 = other.m_iter2->begin(); // <-- line 20
return m_iter1 == other.m_iter1;
}
};
// can't be minimized out
void f1();
void f2(const auto& lhs_value);
int main() {
Set2 s;
auto it1 = Iter_pair(s.end());
auto it2 = Iter_pair(s.end());
if (it1.set_iter1_if_true_is_false(it2)) f1(); else f2(it1);
auto it3 = Iter_pair(s.end());
if (it1.set_iter1_if_true_is_false(it3)) f1();
return 0;
}
```
Full error:
```
In member function 'std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare,
_Alloc>::const_iterator std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare,
_Alloc>::begin() const [with _Key = int; _Val = int; _KeyOfValue =
std::_Identity<int>; _Compare = std::less<int>; _Alloc = std::allocator<int>]',
inlined from 'std::set<_Key, _Compare, _Alloc>::iterator std::set<_Key,
_Compare, _Alloc>::begin() const [with _Key = int; _Compare = std::less<int>;
_Alloc = std::allocator<int>]' at
/opt/compiler-explorer/gcc-trunk-20250402/include/c++/15.0.1/bits/stl_set.h:369:26,
inlined from 'bool Iter_pair::set_iter1_if_true_is_false(Iter_pair&)' at
<source>:20:41,
inlined from 'int main()' at <source>:35:37:
/opt/compiler-explorer/gcc-trunk-20250402/include/c++/15.0.1/bits/stl_tree.h:1625:55:
error: array subscript 'const std::_Rb_tree<int, int, std::_Identity<int>,
std::less<int>, std::allocator<int> >[0]' is partly outside array bounds of
'Set2 [1]' {aka 'std::set<std::set<int> > [1]'} [-Werror=array-bounds=]
```