diff options
author | redi <redi@138bc75d-0d04-0410-961f-82ee72b054a4> | 2017-01-10 17:30:20 +0000 |
---|---|---|
committer | redi <redi@138bc75d-0d04-0410-961f-82ee72b054a4> | 2017-01-10 17:30:20 +0000 |
commit | f81d9928805b94d9f95113849c8b9f62ce88b3ea (patch) | |
tree | eec6350cf193eac941b657624a89f5b22b96b405 /libstdc++-v3 | |
parent | b386d8a161feb82100699969615d77e52ff47fff (diff) | |
download | gcc-f81d9928805b94d9f95113849c8b9f62ce88b3ea.tar.gz |
PR77528 add default constructors for container adaptors
PR libstdc++/77528
* include/bits/stl_queue.h (queue::c): Add default member initializer.
(queue::queue()): Add constructor and define as defaulted.
(queue::queue(_Sequence&&)): Remove default argument.
(priority_queue::c, priority_queue::comp): Add default member
initializers.
(priority_queue::priority_queue()): Add constructor and define as
defaulted.
(priority_queue::priority_queue(const _Compare&, _Sequence&&)):
Remove default argument for first parameter.
* include/bits/stl_stack.h (stack::c): Add default member initializer.
(stack::stack()): Add constructor and define as defaulted.
(stack::stack(const _Sequence&)): Remove default argument.
* testsuite/23_containers/priority_queue/requirements/
explicit_instantiation/1.cc: Test explicit instantiation with
non-DefaultConstructible sequence.
* testsuite/23_containers/priority_queue/77528.cc: New test.
* testsuite/23_containers/priority_queue/requirements/
explicit_instantiation/1_c++0x.cc: Replace with 1_c++98.cc.
* testsuite/23_containers/queue/77528.cc: New test.
* testsuite/23_containers/queue/requirements/explicit_instantiation/
1.cc: Test explicit instantiation with non-DefaultConstructible
sequence.
* testsuite/23_containers/queue/requirements/explicit_instantiation/
1_c++0x.cc: Replace with 1_c++98.cc.
* testsuite/23_containers/stack/77528.cc: New test.
* testsuite/23_containers/stack/requirements/explicit_instantiation/
1.cc: Test explicit instantiation with non-DefaultConstructible
sequence.
* testsuite/23_containers/stack/requirements/explicit_instantiation/
1_c++0x.cc: Replace with 1_c++98.cc.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@244278 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3')
12 files changed, 221 insertions, 12 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index b81ecc89f6a..da1bfe65db9 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,37 @@ +2017-01-10 Jonathan Wakely <jwakely@redhat.com> + + PR libstdc++/77528 + * include/bits/stl_queue.h (queue::c): Add default member initializer. + (queue::queue()): Add constructor and define as defaulted. + (queue::queue(_Sequence&&)): Remove default argument. + (priority_queue::c, priority_queue::comp): Add default member + initializers. + (priority_queue::priority_queue()): Add constructor and define as + defaulted. + (priority_queue::priority_queue(const _Compare&, _Sequence&&)): + Remove default argument for first parameter. + * include/bits/stl_stack.h (stack::c): Add default member initializer. + (stack::stack()): Add constructor and define as defaulted. + (stack::stack(const _Sequence&)): Remove default argument. + * testsuite/23_containers/priority_queue/requirements/ + explicit_instantiation/1.cc: Test explicit instantiation with + non-DefaultConstructible sequence. + * testsuite/23_containers/priority_queue/77528.cc: New test. + * testsuite/23_containers/priority_queue/requirements/ + explicit_instantiation/1_c++0x.cc: Replace with 1_c++98.cc. + * testsuite/23_containers/queue/77528.cc: New test. + * testsuite/23_containers/queue/requirements/explicit_instantiation/ + 1.cc: Test explicit instantiation with non-DefaultConstructible + sequence. + * testsuite/23_containers/queue/requirements/explicit_instantiation/ + 1_c++0x.cc: Replace with 1_c++98.cc. + * testsuite/23_containers/stack/77528.cc: New test. + * testsuite/23_containers/stack/requirements/explicit_instantiation/ + 1.cc: Test explicit instantiation with non-DefaultConstructible + sequence. + * testsuite/23_containers/stack/requirements/explicit_instantiation/ + 1_c++0x.cc: Replace with 1_c++98.cc. + 2017-01-10 Felipe Magno de Almeida <felipe@expertisesolutions.com.br> * include/bits/locale_facets_nonio.tcc diff --git a/libstdc++-v3/include/bits/stl_queue.h b/libstdc++-v3/include/bits/stl_queue.h index 45eba09078d..6417b3067f6 100644 --- a/libstdc++-v3/include/bits/stl_queue.h +++ b/libstdc++-v3/include/bits/stl_queue.h @@ -124,15 +124,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION typedef _Sequence container_type; protected: - /** - * 'c' is the underlying container. Maintainers wondering why - * this isn't uglified as per style guidelines should note that - * this name is specified in the standard, [23.2.3.1]. (Why? - * Presumably for the same reason that it's protected instead + /* Maintainers wondering why this isn't uglified as per style + * guidelines should note that this name is specified in the standard, + * C++98 [23.2.3.1]. + * (Why? Presumably for the same reason that it's protected instead * of private: to allow derivation. But none of the other * containers allow for derivation. Odd.) */ + /// @c c is the underlying container. +#if __cplusplus >= 201103L + _Sequence c{}; +#else _Sequence c; +#endif public: /** @@ -143,12 +147,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION queue(const _Sequence& __c = _Sequence()) : c(__c) { } #else + queue() = default; + explicit queue(const _Sequence& __c) : c(__c) { } explicit - queue(_Sequence&& __c = _Sequence()) + queue(_Sequence&& __c) : c(std::move(__c)) { } template<typename _Alloc, typename _Requires = _Uses<_Alloc>> @@ -440,8 +446,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION protected: // See queue::c for notes on these names. - _Sequence c; +#if __cplusplus >= 201103L + _Sequence c{}; + _Compare comp{}; +#else + _Sequence c; _Compare comp; +#endif public: /** @@ -454,6 +465,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION : c(__s), comp(__x) { std::make_heap(c.begin(), c.end(), comp); } #else + priority_queue() = default; + explicit priority_queue(const _Compare& __x, const _Sequence& __s) @@ -461,7 +474,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { std::make_heap(c.begin(), c.end(), comp); } explicit - priority_queue(const _Compare& __x = _Compare(), + priority_queue(const _Compare& __x, _Sequence&& __s = _Sequence()) : c(std::move(__s)), comp(__x) { std::make_heap(c.begin(), c.end(), comp); } diff --git a/libstdc++-v3/include/bits/stl_stack.h b/libstdc++-v3/include/bits/stl_stack.h index f7020babb9c..a0f9ee520dc 100644 --- a/libstdc++-v3/include/bits/stl_stack.h +++ b/libstdc++-v3/include/bits/stl_stack.h @@ -129,7 +129,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION protected: // See queue::c for notes on this name. +#if __cplusplus >= 201103L + _Sequence c{}; +#else _Sequence c; +#endif public: // XXX removed old def ctor, added def arg to this one to match 14882 @@ -141,12 +145,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION stack(const _Sequence& __c = _Sequence()) : c(__c) { } #else + stack() = default; + explicit stack(const _Sequence& __c) : c(__c) { } explicit - stack(_Sequence&& __c = _Sequence()) + stack(_Sequence&& __c) : c(std::move(__c)) { } template<typename _Alloc, typename _Requires = _Uses<_Alloc>> diff --git a/libstdc++-v3/testsuite/23_containers/priority_queue/77528.cc b/libstdc++-v3/testsuite/23_containers/priority_queue/77528.cc new file mode 100644 index 00000000000..0f953bcc976 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/priority_queue/77528.cc @@ -0,0 +1,39 @@ +// Copyright (C) 2017 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 run { target c++11 } } + +#include <queue> + +struct NoCopying : std::vector<int> +{ + NoCopying() = default; + NoCopying(const NoCopying& x) : std::vector<int>(x) + { throw std::bad_alloc(); } +}; + +void +test01() +{ + std::priority_queue<int, NoCopying> q; +} + +int +main() +{ + test01(); +} diff --git a/libstdc++-v3/testsuite/23_containers/priority_queue/requirements/explicit_instantiation/1.cc b/libstdc++-v3/testsuite/23_containers/priority_queue/requirements/explicit_instantiation/1.cc index 7795547ea5c..77cade0c0f6 100644 --- a/libstdc++-v3/testsuite/23_containers/priority_queue/requirements/explicit_instantiation/1.cc +++ b/libstdc++-v3/testsuite/23_containers/priority_queue/requirements/explicit_instantiation/1.cc @@ -23,3 +23,11 @@ #include <queue> template class std::priority_queue<int>; + +struct NonDefaultConstructible : std::vector<int> { + NonDefaultConstructible(int) { } +}; +struct Cmp : std::less<int> { + Cmp(int) { } +}; +template class std::priority_queue<int, NonDefaultConstructible>; diff --git a/libstdc++-v3/testsuite/23_containers/priority_queue/requirements/explicit_instantiation/1_c++0x.cc b/libstdc++-v3/testsuite/23_containers/priority_queue/requirements/explicit_instantiation/1_c++98.cc index b4af73388b0..0b5b28763d9 100644 --- a/libstdc++-v3/testsuite/23_containers/priority_queue/requirements/explicit_instantiation/1_c++0x.cc +++ b/libstdc++-v3/testsuite/23_containers/priority_queue/requirements/explicit_instantiation/1_c++98.cc @@ -1,4 +1,5 @@ -// { dg-do compile { target c++11 } } +// { dg-options "-std=gnu++98" } +// { dg-do compile } // Copyright (C) 2009-2017 Free Software Foundation, Inc. // @@ -22,3 +23,11 @@ #include <queue> template class std::priority_queue<int>; + +struct NonDefaultConstructible : std::vector<int> { + NonDefaultConstructible(int) { } +}; +struct Cmp : std::less<int> { + Cmp(int) { } +}; +template class std::priority_queue<int, NonDefaultConstructible, Cmp>; diff --git a/libstdc++-v3/testsuite/23_containers/queue/77528.cc b/libstdc++-v3/testsuite/23_containers/queue/77528.cc new file mode 100644 index 00000000000..dff6d6dbaef --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/queue/77528.cc @@ -0,0 +1,39 @@ +// Copyright (C) 2017 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 run { target c++11 } } + +#include <queue> + +struct NoCopying : std::deque<int> +{ + NoCopying() = default; + NoCopying(const NoCopying& x) : std::deque<int>(x) + { throw std::bad_alloc(); } +}; + +void +test01() +{ + std::queue<int, NoCopying> q; +} + +int +main() +{ + test01(); +} diff --git a/libstdc++-v3/testsuite/23_containers/queue/requirements/explicit_instantiation/1.cc b/libstdc++-v3/testsuite/23_containers/queue/requirements/explicit_instantiation/1.cc index 7e49daebc91..503736557e5 100644 --- a/libstdc++-v3/testsuite/23_containers/queue/requirements/explicit_instantiation/1.cc +++ b/libstdc++-v3/testsuite/23_containers/queue/requirements/explicit_instantiation/1.cc @@ -23,3 +23,8 @@ #include <queue> template class std::queue<int>; + +struct NonDefaultConstructible : std::deque<int> { + NonDefaultConstructible(int) { } +}; +template class std::queue<int, NonDefaultConstructible>; diff --git a/libstdc++-v3/testsuite/23_containers/queue/requirements/explicit_instantiation/1_c++0x.cc b/libstdc++-v3/testsuite/23_containers/queue/requirements/explicit_instantiation/1_c++98.cc index 71a9003ab80..4590220af2b 100644 --- a/libstdc++-v3/testsuite/23_containers/queue/requirements/explicit_instantiation/1_c++0x.cc +++ b/libstdc++-v3/testsuite/23_containers/queue/requirements/explicit_instantiation/1_c++98.cc @@ -1,4 +1,5 @@ -// { dg-do compile { target c++11 } } +// { dg-options "-std=gnu++98" } +// { dg-do compile } // Copyright (C) 2009-2017 Free Software Foundation, Inc. // @@ -22,3 +23,8 @@ #include <queue> template class std::queue<int>; + +struct NonDefaultConstructible : std::deque<int> { + NonDefaultConstructible(int) { } +}; +template class std::queue<int, NonDefaultConstructible>; diff --git a/libstdc++-v3/testsuite/23_containers/stack/77528.cc b/libstdc++-v3/testsuite/23_containers/stack/77528.cc new file mode 100644 index 00000000000..dfc3a2adf2a --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/stack/77528.cc @@ -0,0 +1,39 @@ +// Copyright (C) 2017 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 run { target c++11 } } + +#include <stack> + +struct NoCopying : std::deque<int> +{ + NoCopying() = default; + NoCopying(const NoCopying& x) : std::deque<int>(x) + { throw std::bad_alloc(); } +}; + +void +test01() +{ + std::stack<int, NoCopying> s; +} + +int +main() +{ + test01(); +} diff --git a/libstdc++-v3/testsuite/23_containers/stack/requirements/explicit_instantiation/1.cc b/libstdc++-v3/testsuite/23_containers/stack/requirements/explicit_instantiation/1.cc index fe90364c370..b93286df152 100644 --- a/libstdc++-v3/testsuite/23_containers/stack/requirements/explicit_instantiation/1.cc +++ b/libstdc++-v3/testsuite/23_containers/stack/requirements/explicit_instantiation/1.cc @@ -23,3 +23,8 @@ #include <stack> template class std::stack<int>; + +struct NonDefaultConstructible : std::deque<int> { + NonDefaultConstructible(int) { } +}; +template class std::stack<int, NonDefaultConstructible>; diff --git a/libstdc++-v3/testsuite/23_containers/stack/requirements/explicit_instantiation/1_c++0x.cc b/libstdc++-v3/testsuite/23_containers/stack/requirements/explicit_instantiation/1_c++98.cc index 033f02f9348..394d223f181 100644 --- a/libstdc++-v3/testsuite/23_containers/stack/requirements/explicit_instantiation/1_c++0x.cc +++ b/libstdc++-v3/testsuite/23_containers/stack/requirements/explicit_instantiation/1_c++98.cc @@ -1,4 +1,5 @@ -// { dg-do compile { target c++11 } } +// { dg-options "-std=gnu++98" } +// { dg-do compile } // Copyright (C) 2009-2017 Free Software Foundation, Inc. // @@ -22,3 +23,8 @@ #include <stack> template class std::stack<int>; + +struct NonDefaultConstructible : std::deque<int> { + NonDefaultConstructible(int) { } +}; +template class std::stack<int, NonDefaultConstructible>; |