https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83982
Jonathan Wakely <redi at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |ASSIGNED Known to work| |5.5.0 Assignee|unassigned at gcc dot gnu.org |redi at gcc dot gnu.org Summary|Exception guarantee of |[6/7/8/9 Regression] |C++14 |Exception guarantee of |vector::resize(size_type) |C++14 |is not met |vector::resize(size_type) | |is not met Known to fail| |6.4.0, 7.3.0, 8.1.0, 9.0 --- Comment #6 from Jonathan Wakely <redi at gcc dot gnu.org> --- This testcase passes when compiled by GCC 5 with no option (because that means -std=gnu++98 and so elements are copied not moved): #include <vector> #include <assert.h> struct X { X() : data(1) { if (fail) throw 1; } static bool fail; std::vector<int> data; }; bool X::fail = false; void test01() { std::vector<X> v(2); X* const addr = &v[0]; bool caught = false; try { X::fail = true; v.resize(v.capacity() + 1); // force reallocation } catch (int) { caught = true; } assert( caught ); assert( v.size() == 2 ); assert( &v[0] == addr ); // PR libstdc++/83982 assert( ! v[0].data.empty() ); assert( ! v[1].data.empty() ); } int main() { test01(); } But it fails when compiled by GCC 6 or later (except in C++98 modes), because the existing elements are moved from and left empty. That makes this a regression.