* doc/xml/manual/status_cxx2017.xml: Update status.
* doc/html/*: Regenerate.
* include/bits/deque.tcc (deque::emplace_front, deque::emplace_back):
Return a reference in C++17 mode.
* include/bits/forward_list.h (forward_list::emplace_front): Likewise.
* include/bits/stl_bvector.h (vector<bool>::emplace_back): Likewise.
* include/bits/stl_deque.h (deque::emplace_front, deque::emplace_back):
Likewise.
* include/bits/stl_list.h (list::emplace_front, list::emplace_back):
Likewise.
* include/bits/stl_queue.h (queue::emplace): Likewise.
* include/bits/stl_stack.h (stack::emplace): Likewise.
* include/bits/stl_vector.h (vector::emplace_back): Likewise.
* include/bits/vector.tcc (vector::emplace_back): Likewise.
* include/debug/deque (__gnu_debug::deque::emplace_front)
(__gnu_debug::deque::emplace_back): Likewise.
* include/debug/vector (__gnu_debug::vector::emplace_back): Likewise.
* testsuite/23_containers/deque/modifiers/emplace/cxx17_return.cc:
New.
* testsuite/23_containers/forward_list/modifiers/
emplace_cxx17_return.cc: New.
* testsuite/23_containers/list/modifiers/emplace/cxx17_return.cc: New.
* testsuite/23_containers/queue/members/emplace_cxx17_return.cc: New.
* testsuite/23_containers/stack/members/emplace_cxx17_return.cc: New.
* testsuite/23_containers/vector/bool/emplace_cxx17_return.cc: New.
* testsuite/23_containers/vector/modifiers/emplace/cxx17_return.cc:
New.
From-SVN: r241234
+2016-10-17 Jonathan Wakely <jwakely@redhat.com>
+
+ * doc/xml/manual/status_cxx2017.xml: Update status.
+ * doc/html/*: Regenerate.
+ * include/bits/deque.tcc (deque::emplace_front, deque::emplace_back):
+ Return a reference in C++17 mode.
+ * include/bits/forward_list.h (forward_list::emplace_front): Likewise.
+ * include/bits/stl_bvector.h (vector<bool>::emplace_back): Likewise.
+ * include/bits/stl_deque.h (deque::emplace_front, deque::emplace_back):
+ Likewise.
+ * include/bits/stl_list.h (list::emplace_front, list::emplace_back):
+ Likewise.
+ * include/bits/stl_queue.h (queue::emplace): Likewise.
+ * include/bits/stl_stack.h (stack::emplace): Likewise.
+ * include/bits/stl_vector.h (vector::emplace_back): Likewise.
+ * include/bits/vector.tcc (vector::emplace_back): Likewise.
+ * include/debug/deque (__gnu_debug::deque::emplace_front)
+ (__gnu_debug::deque::emplace_back): Likewise.
+ * include/debug/vector (__gnu_debug::vector::emplace_back): Likewise.
+ * testsuite/23_containers/deque/modifiers/emplace/cxx17_return.cc:
+ New.
+ * testsuite/23_containers/forward_list/modifiers/
+ emplace_cxx17_return.cc: New.
+ * testsuite/23_containers/list/modifiers/emplace/cxx17_return.cc: New.
+ * testsuite/23_containers/queue/members/emplace_cxx17_return.cc: New.
+ * testsuite/23_containers/stack/members/emplace_cxx17_return.cc: New.
+ * testsuite/23_containers/vector/bool/emplace_cxx17_return.cc: New.
+ * testsuite/23_containers/vector/modifiers/emplace/cxx17_return.cc:
+ New.
+
2016-10-16 Paolo Carlini <paolo.carlini@oracle.com>
* testsuite/22_locale/classification/isblank.cc: Remove 'test'
</a>
</td><td align="center"> 6.2 (3.0)</td><td align="left"><code class="code"> __cpp_lib_incomplete_container_elements >= 201505 </code>
(the feature was always supported, but the macro was not defined until GCC 6.2)
- </td></tr><tr bgcolor="#C8B0B0"><td align="left"> Emplace return type </td><td align="left">
+ </td></tr><tr><td align="left"> Emplace return type </td><td align="left">
<a class="link" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0084r2.pdf" target="_top">
P0084R2
</a>
- </td><td align="center"> No </td><td align="left"> </td></tr><tr><td align="left">Improved insertion interface for unique-key maps</td><td align="left">
+ </td><td align="center"> 7 </td><td align="left"> </td></tr><tr><td align="left">Improved insertion interface for unique-key maps</td><td align="left">
<a class="link" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4279.html" target="_top">
N4279
</a>
<span class="command"><strong>make</strong></span>, or via options for the DejaGnu test framework
(described below). The latter approach uses the
<code class="option">--target_board</code> option that was shown earlier.
- For example, to run the tests with <code class="option">-O1 -D_GLIBCXX_ASSERT</code>
+ For example, to run the tests with <code class="option">-O1 -D_GLIBCXX_ASSERTIONS</code>
you could use:
</p><pre class="programlisting"> make RUNTESTFLAGS=--target_board=unix/-O1/-D_GLIBCXX_ASSERTIONS</pre><p>
</p><p>
</row>
<row>
- <?dbhtml bgcolor="#C8B0B0" ?>
<entry> Emplace return type </entry>
<entry>
<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0084r2.pdf">
P0084R2
</link>
</entry>
- <entry align="center"> No </entry>
+ <entry align="center"> 7 </entry>
<entry/>
</row>
#if __cplusplus >= 201103L
template<typename _Tp, typename _Alloc>
template<typename... _Args>
+#if __cplusplus > 201402L
+ typename deque<_Tp, _Alloc>::reference
+#else
void
+#endif
deque<_Tp, _Alloc>::
emplace_front(_Args&&... __args)
{
}
else
_M_push_front_aux(std::forward<_Args>(__args)...);
+#if __cplusplus > 201402L
+ return front();
+#endif
}
template<typename _Tp, typename _Alloc>
template<typename... _Args>
+#if __cplusplus > 201402L
+ typename deque<_Tp, _Alloc>::reference
+#else
void
+#endif
deque<_Tp, _Alloc>::
emplace_back(_Args&&... __args)
{
}
else
_M_push_back_aux(std::forward<_Args>(__args)...);
+#if __cplusplus > 201402L
+ return back();
+#endif
}
#endif
* and references.
*/
template<typename... _Args>
- void
+#if __cplusplus > 201402L
+ reference
+#else
+ void
+#endif
emplace_front(_Args&&... __args)
- { this->_M_insert_after(cbefore_begin(),
- std::forward<_Args>(__args)...); }
+ {
+ this->_M_insert_after(cbefore_begin(),
+ std::forward<_Args>(__args)...);
+#if __cplusplus > 201402L
+ return front();
+#endif
+ }
/**
* @brief Add data to the front of the %forward_list.
#if __cplusplus >= 201103L
template<typename... _Args>
+#if __cplusplus > 201402L
+ reference
+#else
void
+#endif
emplace_back(_Args&&... __args)
- { push_back(bool(__args...)); }
+ {
+ push_back(bool(__args...));
+#if __cplusplus > 201402L
+ return back();
+#endif
+ }
template<typename... _Args>
iterator
{ emplace_front(std::move(__x)); }
template<typename... _Args>
- void
+#if __cplusplus > 201402L
+ reference
+#else
+ void
+#endif
emplace_front(_Args&&... __args);
#endif
{ emplace_back(std::move(__x)); }
template<typename... _Args>
- void
+#if __cplusplus > 201402L
+ reference
+#else
+ void
+#endif
emplace_back(_Args&&... __args);
#endif
{ this->_M_insert(begin(), std::move(__x)); }
template<typename... _Args>
- void
+#if __cplusplus > 201402L
+ reference
+#else
+ void
+#endif
emplace_front(_Args&&... __args)
- { this->_M_insert(begin(), std::forward<_Args>(__args)...); }
+ {
+ this->_M_insert(begin(), std::forward<_Args>(__args)...);
+#if __cplusplus > 201402L
+ return front();
+#endif
+ }
#endif
/**
{ this->_M_insert(end(), std::move(__x)); }
template<typename... _Args>
- void
+#if __cplusplus > 201402L
+ reference
+#else
+ void
+#endif
emplace_back(_Args&&... __args)
- { this->_M_insert(end(), std::forward<_Args>(__args)...); }
+ {
+ this->_M_insert(end(), std::forward<_Args>(__args)...);
+#if __cplusplus > 201402L
+ return back();
+#endif
+ }
#endif
/**
push(value_type&& __x)
{ c.push_back(std::move(__x)); }
+#if __cplusplus > 201402L
+ template<typename... _Args>
+ decltype(auto)
+ emplace(_Args&&... __args)
+ { return c.emplace_back(std::forward<_Args>(__args)...); }
+#else
template<typename... _Args>
void
emplace(_Args&&... __args)
{ c.emplace_back(std::forward<_Args>(__args)...); }
+#endif
#endif
/**
push(value_type&& __x)
{ c.push_back(std::move(__x)); }
+#if __cplusplus > 201402L
+ template<typename... _Args>
+ decltype(auto)
+ emplace(_Args&&... __args)
+ { return c.emplace_back(std::forward<_Args>(__args)...); }
+#else
template<typename... _Args>
void
emplace(_Args&&... __args)
{ c.emplace_back(std::forward<_Args>(__args)...); }
+#endif
#endif
/**
{ emplace_back(std::move(__x)); }
template<typename... _Args>
+#if __cplusplus > 201402L
+ reference
+#else
void
+#endif
emplace_back(_Args&&... __args);
#endif
#if __cplusplus >= 201103L
template<typename _Tp, typename _Alloc>
template<typename... _Args>
+#if __cplusplus > 201402L
+ typename vector<_Tp, _Alloc>::reference
+#else
void
+#endif
vector<_Tp, _Alloc>::
emplace_back(_Args&&... __args)
{
}
else
_M_realloc_insert(end(), std::forward<_Args>(__args)...);
+#if __cplusplus > 201402L
+ return back();
+#endif
}
#endif
{ emplace_back(std::move(__x)); }
template<typename... _Args>
+#if __cplusplus > 201402L
+ reference
+#else
void
+#endif
emplace_front(_Args&&... __args)
{
_Base::emplace_front(std::forward<_Args>(__args)...);
this->_M_invalidate_all();
+#if __cplusplus > 201402L
+ return front();
+#endif
}
template<typename... _Args>
+#if __cplusplus > 201402L
+ reference
+#else
void
+#endif
emplace_back(_Args&&... __args)
{
_Base::emplace_back(std::forward<_Args>(__args)...);
this->_M_invalidate_all();
+#if __cplusplus > 201402L
+ return back();
+#endif
}
template<typename... _Args>
{ emplace_back(std::move(__x)); }
template<typename... _Args>
+#if __cplusplus > 201402L
+ deque<_Tp, _Alloc>::reference
+#else
void
+#endif
emplace_back(_Args&&... __args)
{
bool __realloc = this->_M_requires_reallocation(this->size() + 1);
if (__realloc)
this->_M_invalidate_all();
this->_M_update_guaranteed_capacity();
+#if __cplusplus > 201402L
+ return back();
+#endif
}
#endif
--- /dev/null
+// Copyright (C) 2016 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-options "-std=gnu++17" }
+// { dg-do run { target c++1z } }
+
+#include <deque>
+#include <testsuite_hooks.h>
+
+using test_type = std::deque<int>;
+
+void
+test01()
+{
+ test_type x{1, 2, 3, 4};
+ test_type::reference r = x.emplace_front(0);
+ VERIFY( r == 0 );
+ VERIFY( &r == &x.front() );
+}
+
+void
+test02()
+{
+ test_type x{1, 2, 3, 4};
+ test_type::reference r = x.emplace_back(5);
+ VERIFY( r == 5 );
+ VERIFY( &r == &x.back() );
+}
+
+int
+main()
+{
+ test01();
+ test02();
+}
--- /dev/null
+// Copyright (C) 2016 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-options "-std=gnu++17" }
+// { dg-do run { target c++1z } }
+
+#include <forward_list>
+#include <testsuite_hooks.h>
+
+using test_type = std::forward_list<int>;
+
+void
+test01()
+{
+ test_type x{1, 2, 3, 4};
+ test_type::reference r = x.emplace_front(0);
+ VERIFY( r == 0 );
+ VERIFY( &r == &x.front() );
+}
+
+int
+main()
+{
+ test01();
+}
--- /dev/null
+// Copyright (C) 2016 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-options "-std=gnu++17" }
+// { dg-do run { target c++1z } }
+
+#include <list>
+#include <testsuite_hooks.h>
+
+using test_type = std::list<int>;
+
+void
+test01()
+{
+ test_type x{1, 2, 3, 4};
+ test_type::reference r = x.emplace_front(0);
+ VERIFY( r == 0 );
+ VERIFY( &r == &x.front() );
+}
+
+void
+test02()
+{
+ test_type x{1, 2, 3, 4};
+ test_type::reference r = x.emplace_back(5);
+ VERIFY( r == 5 );
+ VERIFY( &r == &x.back() );
+}
+
+int
+main()
+{
+ test01();
+ test02();
+}
--- /dev/null
+// Copyright (C) 2016 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-options "-std=gnu++17" }
+// { dg-do run { target c++1z } }
+
+#include <queue>
+#include <testsuite_hooks.h>
+
+using test_type = std::queue<int>;
+
+void
+test01()
+{
+ test_type x{ test_type::container_type{1, 2, 3, 4} };
+ test_type::reference r = x.emplace(5);
+ VERIFY( r == 5 );
+ VERIFY( &r == &x.back() );
+}
+
+int
+main()
+{
+ test01();
+}
--- /dev/null
+// Copyright (C) 2016 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-options "-std=gnu++17" }
+// { dg-do run { target c++1z } }
+
+#include <stack>
+#include <testsuite_hooks.h>
+
+using test_type = std::stack<int>;
+
+void
+test01()
+{
+ test_type x{ test_type::container_type{1, 2, 3, 4} };
+ test_type::reference r = x.emplace(5);
+ VERIFY( r == 5 );
+ VERIFY( &r == &x.top() );
+}
+
+int
+main()
+{
+ test01();
+}
--- /dev/null
+// Copyright (C) 2016 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-options "-std=gnu++17" }
+// { dg-do run { target c++1z } }
+
+#include <vector>
+#include <testsuite_hooks.h>
+
+using test_type = std::vector<bool>;
+
+void
+test02()
+{
+ test_type x{true, true};
+ test_type::reference r = x.emplace_back(false);
+ VERIFY( r == false );
+}
+
+int
+main()
+{
+ test02();
+}
--- /dev/null
+// Copyright (C) 2016 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-options "-std=gnu++17" }
+// { dg-do run { target c++1z } }
+
+#include <vector>
+#include <testsuite_hooks.h>
+
+using test_type = std::vector<int>;
+
+void
+test02()
+{
+ test_type x{1, 2, 3, 4};
+ test_type::reference r = x.emplace_back(5);
+ VERIFY( r == 5 );
+ VERIFY( &r == &x.back() );
+}
+
+int
+main()
+{
+ test02();
+}