diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 145eaa81edb..5dc4295a1f6 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,18 @@ 2018-10-30 Jonathan Wakely + 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 ebec3b5c818..1d01a54721b 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 19c16839cfa..3752897272f 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 3544981698c..cb8aa88d548 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 40debd62396..05f9b7ef6c3 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 00000000000..cde9dfff3e0 --- /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 +// . + +// { dg-do compile { target c++11 } } + +#include + +template +struct Alloc +{ + using value_type = T; + + T* allocate(unsigned n); + void deallocate(T* p, unsigned n); + + Alloc(int) { } + + template + Alloc(const Alloc&) { } +}; + +template + bool operator==(Alloc, Alloc) { return true; } +template + bool operator!=(Alloc, Alloc) { return false; } + +constexpr bool b + = std::is_default_constructible>>::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 00000000000..d7c5256b62c --- /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 +// . + +// { dg-do compile { target c++11 } } + +#include + +template +struct Alloc +{ + using value_type = T; + + T* allocate(unsigned n); + void deallocate(T* p, unsigned n); + + Alloc(int) { } + + template + Alloc(const Alloc&) { } +}; + +template + bool operator==(Alloc, Alloc) { return true; } +template + bool operator!=(Alloc, Alloc) { return false; } + +constexpr bool b + = std::is_default_constructible>>::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 00000000000..b697abe5658 --- /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 +// . + +// { dg-do compile { target c++11 } } + +#include + +template +struct Alloc +{ + using value_type = T; + + T* allocate(unsigned n); + void deallocate(T* p, unsigned n); + + Alloc(int) { } + + template + Alloc(const Alloc&) { } +}; + +template + bool operator==(Alloc, Alloc) { return true; } +template + bool operator!=(Alloc, Alloc) { return false; } + +constexpr bool b + = std::is_default_constructible>>::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 00000000000..07199339b14 --- /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 +// . + +// { dg-do compile { target c++11 } } + +#include + +template +struct Alloc +{ + using value_type = T; + + T* allocate(unsigned n); + void deallocate(T* p, unsigned n); + + Alloc(int) { } + + template + Alloc(const Alloc&) { } +}; + +template + bool operator==(Alloc, Alloc) { return true; } +template + bool operator!=(Alloc, Alloc) { return false; } + +constexpr bool b + = std::is_default_constructible>>::value;