diff options
| author | ian <ian@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-05-25 23:09:14 +0000 |
|---|---|---|
| committer | ian <ian@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-05-25 23:09:14 +0000 |
| commit | b340a9ea726710235ff009fd0f6e767742ff8939 (patch) | |
| tree | c4e6283a51cca060e1f1e57da5f033aa3fced142 /libstdc++-v3/include/backward | |
| parent | 6557b8b81d15df09152e67c98157d2e71083d8f7 (diff) | |
| download | ppe42-gcc-b340a9ea726710235ff009fd0f6e767742ff8939.tar.gz ppe42-gcc-b340a9ea726710235ff009fd0f6e767742ff8939.zip | |
PR libstdc++/49060
* include/backward/hashtable.h (hashtable::erase): Don't crash if
erasing first and another element with a reference to the other
element.
* testsuite/backward/hash_set/49060.cc: New.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@174240 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3/include/backward')
| -rw-r--r-- | libstdc++-v3/include/backward/hashtable.h | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/libstdc++-v3/include/backward/hashtable.h b/libstdc++-v3/include/backward/hashtable.h index 0bcaec4fdc2..91b0c602cec 100644 --- a/libstdc++-v3/include/backward/hashtable.h +++ b/libstdc++-v3/include/backward/hashtable.h @@ -898,13 +898,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __next = __cur->_M_next; } } - if (_M_equals(_M_get_key(__first->_M_val), __key)) - { - _M_buckets[__n] = __first->_M_next; - _M_delete_node(__first); - ++__erased; - --_M_num_elements; - } + bool __delete_first = _M_equals(_M_get_key(__first->_M_val), __key); if (__saved_slot) { __next = __saved_slot->_M_next; @@ -913,6 +907,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ++__erased; --_M_num_elements; } + if (__delete_first) + { + _M_buckets[__n] = __first->_M_next; + _M_delete_node(__first); + ++__erased; + --_M_num_elements; + } } return __erased; } |

