aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2018-10-30 14:49:43 +0000
committerJonathan Wakely <redi@gcc.gnu.org>2018-10-30 14:49:43 +0000
commit0321d9fac6eff34ef1cd91610a59070d0e9ff54d (patch)
treed7ef8e75bc61515acd3feda3aad3d0beb6ae3d77
parentc397f267f1d0e8ea286904bc5543829b558e154f (diff)
downloadgcc-0321d9fac6eff34ef1cd91610a59070d0e9ff54d.zip
gcc-0321d9fac6eff34ef1cd91610a59070d0e9ff54d.tar.gz
gcc-0321d9fac6eff34ef1cd91610a59070d0e9ff54d.tar.bz2
PR libstdc++/87809 avoid invalid expressions in exception specifications
If the allocator isn't default constructible then checking if the default constructor throws in an exception specification makes the declaration invalid. Use the type trait instead. PR libstdc++/87809 * include/bits/forward_list.h (_Fwd_list_impl::_Fwd_list_impl()): Use trait in exception-specification instead of possibly invalid expression. * include/bits/stl_bvector.h (_Bvector_impl::_Bvector_impl()): Likewise. * include/bits/stl_list.h (_List_impl::_List_impl()): Likewise. * include/bits/stl_vector.h (_Vector_impl::_Vector_impl()): Likewise. * testsuite/23_containers/forward_list/cons/87809.cc: New test. * testsuite/23_containers/list/cons/87809.cc: New test. * testsuite/23_containers/vector/bool/cons/87809.cc: New test. * testsuite/23_containers/vector/cons/87809.cc: New test. From-SVN: r265626
-rw-r--r--libstdc++-v3/ChangeLog13
-rw-r--r--libstdc++-v3/include/bits/forward_list.h2
-rw-r--r--libstdc++-v3/include/bits/stl_bvector.h4
-rw-r--r--libstdc++-v3/include/bits/stl_list.h3
-rw-r--r--libstdc++-v3/include/bits/stl_vector.h3
-rw-r--r--libstdc++-v3/testsuite/23_containers/forward_list/cons/87809.cc42
-rw-r--r--libstdc++-v3/testsuite/23_containers/list/cons/87809.cc42
-rw-r--r--libstdc++-v3/testsuite/23_containers/vector/bool/cons/87809.cc42
-rw-r--r--libstdc++-v3/testsuite/23_containers/vector/cons/87809.cc42
9 files changed, 188 insertions, 5 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 145eaa8..5dc4295 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,5 +1,18 @@
2018-10-30 Jonathan Wakely <jwakely@redhat.com>
+ PR libstdc++/87809
+ * include/bits/forward_list.h (_Fwd_list_impl::_Fwd_list_impl()): Use
+ trait in exception-specification instead of possibly invalid
+ expression.
+ * include/bits/stl_bvector.h (_Bvector_impl::_Bvector_impl()):
+ Likewise.
+ * include/bits/stl_list.h (_List_impl::_List_impl()): Likewise.
+ * include/bits/stl_vector.h (_Vector_impl::_Vector_impl()): Likewise.
+ * testsuite/23_containers/forward_list/cons/87809.cc: New test.
+ * testsuite/23_containers/list/cons/87809.cc: New test.
+ * testsuite/23_containers/vector/bool/cons/87809.cc: New test.
+ * testsuite/23_containers/vector/cons/87809.cc: New test.
+
PR libstdc++/87784
* include/tr2/dynamic_bitset (dynamic_bitset::push_back): When there
are no unused bits in the last block, append a new block with the
diff --git a/libstdc++-v3/include/bits/forward_list.h b/libstdc++-v3/include/bits/forward_list.h
index ebec3b5..1d01a54 100644
--- a/libstdc++-v3/include/bits/forward_list.h
+++ b/libstdc++-v3/include/bits/forward_list.h
@@ -293,7 +293,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
_Fwd_list_node_base _M_head;
_Fwd_list_impl()
- noexcept( noexcept(_Node_alloc_type()) )
+ noexcept(is_nothrow_default_constructible<_Node_alloc_type>::value)
: _Node_alloc_type(), _M_head()
{ }
diff --git a/libstdc++-v3/include/bits/stl_bvector.h b/libstdc++-v3/include/bits/stl_bvector.h
index 19c1683..3752897 100644
--- a/libstdc++-v3/include/bits/stl_bvector.h
+++ b/libstdc++-v3/include/bits/stl_bvector.h
@@ -473,8 +473,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
: public _Bit_alloc_type, public _Bvector_impl_data
{
public:
- _Bvector_impl()
- _GLIBCXX_NOEXCEPT_IF( noexcept(_Bit_alloc_type()) )
+ _Bvector_impl() _GLIBCXX_NOEXCEPT_IF(
+ is_nothrow_default_constructible<_Bit_alloc_type>::value)
: _Bit_alloc_type()
{ }
diff --git a/libstdc++-v3/include/bits/stl_list.h b/libstdc++-v3/include/bits/stl_list.h
index 3544981..cb8aa88 100644
--- a/libstdc++-v3/include/bits/stl_list.h
+++ b/libstdc++-v3/include/bits/stl_list.h
@@ -372,7 +372,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
{
__detail::_List_node_header _M_node;
- _List_impl() _GLIBCXX_NOEXCEPT_IF( noexcept(_Node_alloc_type()) )
+ _List_impl() _GLIBCXX_NOEXCEPT_IF(
+ is_nothrow_default_constructible<_Node_alloc_type>::value)
: _Node_alloc_type()
{ }
diff --git a/libstdc++-v3/include/bits/stl_vector.h b/libstdc++-v3/include/bits/stl_vector.h
index 40debd6..05f9b7e 100644
--- a/libstdc++-v3/include/bits/stl_vector.h
+++ b/libstdc++-v3/include/bits/stl_vector.h
@@ -125,7 +125,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
struct _Vector_impl
: public _Tp_alloc_type, public _Vector_impl_data
{
- _Vector_impl() _GLIBCXX_NOEXCEPT_IF( noexcept(_Tp_alloc_type()) )
+ _Vector_impl() _GLIBCXX_NOEXCEPT_IF(
+ is_nothrow_default_constructible<_Tp_alloc_type>::value)
: _Tp_alloc_type()
{ }
diff --git a/libstdc++-v3/testsuite/23_containers/forward_list/cons/87809.cc b/libstdc++-v3/testsuite/23_containers/forward_list/cons/87809.cc
new file mode 100644
index 0000000..cde9dff
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/forward_list/cons/87809.cc
@@ -0,0 +1,42 @@
+// Copyright (C) 2018 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-do compile { target c++11 } }
+
+#include <forward_list>
+
+template <typename T>
+struct Alloc
+{
+ using value_type = T;
+
+ T* allocate(unsigned n);
+ void deallocate(T* p, unsigned n);
+
+ Alloc(int) { }
+
+ template<typename U>
+ Alloc(const Alloc<U>&) { }
+};
+
+template<typename T, typename U>
+ bool operator==(Alloc<T>, Alloc<U>) { return true; }
+template<typename T, typename U>
+ bool operator!=(Alloc<T>, Alloc<U>) { return false; }
+
+constexpr bool b
+ = std::is_default_constructible<std::forward_list<bool, Alloc<bool>>>::value;
diff --git a/libstdc++-v3/testsuite/23_containers/list/cons/87809.cc b/libstdc++-v3/testsuite/23_containers/list/cons/87809.cc
new file mode 100644
index 0000000..d7c5256
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/list/cons/87809.cc
@@ -0,0 +1,42 @@
+// Copyright (C) 2018 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-do compile { target c++11 } }
+
+#include <list>
+
+template <typename T>
+struct Alloc
+{
+ using value_type = T;
+
+ T* allocate(unsigned n);
+ void deallocate(T* p, unsigned n);
+
+ Alloc(int) { }
+
+ template<typename U>
+ Alloc(const Alloc<U>&) { }
+};
+
+template<typename T, typename U>
+ bool operator==(Alloc<T>, Alloc<U>) { return true; }
+template<typename T, typename U>
+ bool operator!=(Alloc<T>, Alloc<U>) { return false; }
+
+constexpr bool b
+ = std::is_default_constructible<std::list<bool, Alloc<bool>>>::value;
diff --git a/libstdc++-v3/testsuite/23_containers/vector/bool/cons/87809.cc b/libstdc++-v3/testsuite/23_containers/vector/bool/cons/87809.cc
new file mode 100644
index 0000000..b697abe
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/vector/bool/cons/87809.cc
@@ -0,0 +1,42 @@
+// Copyright (C) 2018 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-do compile { target c++11 } }
+
+#include <vector>
+
+template <typename T>
+struct Alloc
+{
+ using value_type = T;
+
+ T* allocate(unsigned n);
+ void deallocate(T* p, unsigned n);
+
+ Alloc(int) { }
+
+ template<typename U>
+ Alloc(const Alloc<U>&) { }
+};
+
+template<typename T, typename U>
+ bool operator==(Alloc<T>, Alloc<U>) { return true; }
+template<typename T, typename U>
+ bool operator!=(Alloc<T>, Alloc<U>) { return false; }
+
+constexpr bool b
+ = std::is_default_constructible<std::vector<bool, Alloc<bool>>>::value;
diff --git a/libstdc++-v3/testsuite/23_containers/vector/cons/87809.cc b/libstdc++-v3/testsuite/23_containers/vector/cons/87809.cc
new file mode 100644
index 0000000..0719933
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/vector/cons/87809.cc
@@ -0,0 +1,42 @@
+// Copyright (C) 2018 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-do compile { target c++11 } }
+
+#include <vector>
+
+template <typename T>
+struct Alloc
+{
+ using value_type = T;
+
+ T* allocate(unsigned n);
+ void deallocate(T* p, unsigned n);
+
+ Alloc(int) { }
+
+ template<typename U>
+ Alloc(const Alloc<U>&) { }
+};
+
+template<typename T, typename U>
+ bool operator==(Alloc<T>, Alloc<U>) { return true; }
+template<typename T, typename U>
+ bool operator!=(Alloc<T>, Alloc<U>) { return false; }
+
+constexpr bool b
+ = std::is_default_constructible<std::vector<int, Alloc<int>>>::value;