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
This commit is contained in:
Jonathan Wakely 2018-10-30 14:49:43 +00:00 committed by Jonathan Wakely
parent c397f267f1
commit 0321d9fac6
9 changed files with 188 additions and 5 deletions

View File

@ -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

View File

@ -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()
{ }

View File

@ -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()
{ }

View File

@ -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()
{ }

View File

@ -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()
{ }

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;