Testing conditions:
- CentOS 7.0 g ++ 4.8.2
- Arch Linux g ++ 4.9.0 20140604 (preview)
- Arch Linux g ++ 4.9.1
Compile commands:
- PASS: g ++ -Wall t.cpp
- FAIL: g ++ -Wall -O2 t.cpp
- PASS: g ++ -Wall -O2 t.cpp # and replace 2 with 3 on line 13
- PASS: g ++ -Wall -O2 t.cpp # and comment line 14
- PASS: g ++ -Wall -O2 -std = C ++ 11 t.cpp # for g ++ 4.8 / 4.9
FAIL Message:
t.cpp: In member function 'void std::vector<_Tp, _Alloc>::_M_insert_aux(std::vecto <_Tp, _Alloc>::iterator, const _Tp&) [with _Tp = Object; _Alloc = std::allocator<Ob ject>; std::vector<_Tp, _Alloc>::iterator = __gnu_cxx::__normal_iterator<Object*, s td::vector<Object> >; typename std::_Vector_base<_Tp, _Alloc>::pointer = Object*]' t.cpp:17:15: warning: array subscript is above array bounds [-Warray-bounds] ~Object() {}; ^ t.cpp:17:15: warning: array subscript is above array bounds [-Warray-bounds]
t.cpp
#include <vector> class TestCls { public: TestCls() {}; virtual ~TestCls() {}; }; class TestCls1 : public TestCls { }; class Object { public: TestCls m_member[2]; TestCls1 m_member1[2]; // LINE 13, if change to [3] it works. TestCls1 m_member2[2]; // LINE 14, if comment out this line, it works. Object() {}; ~Object() {}; // LINE 17 the warning line }; class Container { public: std::vector<Object> m_obj; Container() {}; ~Container() {}; }; int main() { Container con; Object obj; con.m_obj.push_back(obj); }
c ++ stl g ++
Daniel YC Lin
source share