aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely.gcc@gmail.com>2012-03-04 12:49:22 +0000
committerJonathan Wakely <redi@gcc.gnu.org>2012-03-04 12:49:22 +0000
commitfaef17d891c5d524f7f902deccd5804aad0737fa (patch)
tree12154c48b478dd2fb2d1d70c4db03a56eb7f12f5
parentb12866c71e00d727796101210069fb00de5c11cc (diff)
downloadgcc-faef17d891c5d524f7f902deccd5804aad0737fa.zip
gcc-faef17d891c5d524f7f902deccd5804aad0737fa.tar.gz
gcc-faef17d891c5d524f7f902deccd5804aad0737fa.tar.bz2
re PR libstdc++/52433 ([C++11] debug mode iterators need to move)
PR libstdc++/52433 * include/debug/safe_iterator.h (_Safe_iterator): Add move constructor and move assignment operator. * testsuite/23_containers/vector/debug/52433.cc: New. From-SVN: r184880
-rw-r--r--libstdc++-v3/ChangeLog7
-rw-r--r--libstdc++-v3/include/debug/safe_iterator.h33
-rw-r--r--libstdc++-v3/testsuite/23_containers/vector/debug/52433.cc43
3 files changed, 82 insertions, 1 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 3abfc94..800738e 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,10 @@
+2012-03-04 Jonathan Wakely <jwakely.gcc@gmail.com>
+
+ PR libstdc++/52433
+ * include/debug/safe_iterator.h (_Safe_iterator): Add move
+ constructor and move assignment operator.
+ * testsuite/23_containers/vector/debug/52433.cc: New.
+
2012-03-02 Paolo Carlini <paolo.carlini@oracle.com>
* include/std/limits (numeric_limits): Fix returns per C++11.
diff --git a/libstdc++-v3/include/debug/safe_iterator.h b/libstdc++-v3/include/debug/safe_iterator.h
index e7cfe9c..65dff55 100644
--- a/libstdc++-v3/include/debug/safe_iterator.h
+++ b/libstdc++-v3/include/debug/safe_iterator.h
@@ -169,6 +169,19 @@ namespace __gnu_debug
._M_iterator(__x, "other"));
}
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+ /**
+ * @brief Move construction.
+ * @post __x is singular and unattached
+ */
+ _Safe_iterator(_Safe_iterator&& __x) : _M_current()
+ {
+ std::swap(_M_current, __x._M_current);
+ this->_M_attach(__x._M_sequence);
+ __x._M_detach();
+ }
+#endif
+
/**
* @brief Converting constructor from a mutable iterator to a
* constant iterator.
@@ -208,6 +221,22 @@ namespace __gnu_debug
return *this;
}
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+ /**
+ * @brief Move assignment.
+ * @post __x is singular and unattached
+ */
+ _Safe_iterator&
+ operator=(_Safe_iterator&& __x)
+ {
+ _M_current = __x._M_current;
+ _M_attach(__x._M_sequence);
+ __x._M_detach();
+ __x._M_current = _Iterator();
+ return *this;
+ }
+#endif
+
/**
* @brief Iterator dereference.
* @pre iterator is dereferenceable
@@ -422,7 +451,9 @@ namespace __gnu_debug
/// Is this iterator equal to the sequence's before_begin() iterator if
/// any?
bool _M_is_before_begin() const
- { return _BeforeBeginHelper<_Sequence>::_M_Is(base(), _M_get_sequence()); }
+ {
+ return _BeforeBeginHelper<_Sequence>::_M_Is(base(), _M_get_sequence());
+ }
};
template<typename _IteratorL, typename _IteratorR, typename _Sequence>
diff --git a/libstdc++-v3/testsuite/23_containers/vector/debug/52433.cc b/libstdc++-v3/testsuite/23_containers/vector/debug/52433.cc
new file mode 100644
index 0000000..f1f5917
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/vector/debug/52433.cc
@@ -0,0 +1,43 @@
+// Copyright (C) 2012 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+//
+// { dg-require-debug-mode "" }
+// { dg-options "-std=gnu++0x" }
+// { dg-do compile }
+
+// PR libstdc++/52433
+
+#include <vector>
+
+struct X
+{
+ std::vector<int>::iterator i;
+
+ X() = default;
+ X(const X&) = default;
+ X(X&&) = default;
+ X& operator=(const X&) = default;
+ X& operator=(X&&) = default;
+};
+
+X test01()
+{
+ X x;
+ x = X();
+ return x;
+}
+