From: Jonathan Wakely Date: Tue, 10 Jan 2017 17:30:20 +0000 (+0000) Subject: PR77528 add default constructors for container adaptors X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=d2e1d4b71387f5fbcf7198f05ddeb39e38b3d511;p=gcc.git 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. From-SVN: r244278 --- 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 + + 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 * 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> @@ -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> 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 +// . + +// { dg-do run { target c++11 } } + +#include + +struct NoCopying : std::vector +{ + NoCopying() = default; + NoCopying(const NoCopying& x) : std::vector(x) + { throw std::bad_alloc(); } +}; + +void +test01() +{ + std::priority_queue 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 template class std::priority_queue; + +struct NonDefaultConstructible : std::vector { + NonDefaultConstructible(int) { } +}; +struct Cmp : std::less { + Cmp(int) { } +}; +template class std::priority_queue; 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++0x.cc deleted file mode 100644 index b4af73388b0..00000000000 --- a/libstdc++-v3/testsuite/23_containers/priority_queue/requirements/explicit_instantiation/1_c++0x.cc +++ /dev/null @@ -1,24 +0,0 @@ -// { dg-do compile { target c++11 } } - -// Copyright (C) 2009-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 -// . - -// This file tests explicit instantiation of library containers. - -#include - -template class std::priority_queue; diff --git a/libstdc++-v3/testsuite/23_containers/priority_queue/requirements/explicit_instantiation/1_c++98.cc b/libstdc++-v3/testsuite/23_containers/priority_queue/requirements/explicit_instantiation/1_c++98.cc new file mode 100644 index 00000000000..0b5b28763d9 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/priority_queue/requirements/explicit_instantiation/1_c++98.cc @@ -0,0 +1,33 @@ +// { dg-options "-std=gnu++98" } +// { dg-do compile } + +// Copyright (C) 2009-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 +// . + +// This file tests explicit instantiation of library containers. + +#include + +template class std::priority_queue; + +struct NonDefaultConstructible : std::vector { + NonDefaultConstructible(int) { } +}; +struct Cmp : std::less { + Cmp(int) { } +}; +template class std::priority_queue; 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 +// . + +// { dg-do run { target c++11 } } + +#include + +struct NoCopying : std::deque +{ + NoCopying() = default; + NoCopying(const NoCopying& x) : std::deque(x) + { throw std::bad_alloc(); } +}; + +void +test01() +{ + std::queue 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 template class std::queue; + +struct NonDefaultConstructible : std::deque { + NonDefaultConstructible(int) { } +}; +template class std::queue; 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++0x.cc deleted file mode 100644 index 71a9003ab80..00000000000 --- a/libstdc++-v3/testsuite/23_containers/queue/requirements/explicit_instantiation/1_c++0x.cc +++ /dev/null @@ -1,24 +0,0 @@ -// { dg-do compile { target c++11 } } - -// Copyright (C) 2009-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 -// . - -// This file tests explicit instantiation of library containers. - -#include - -template class std::queue; diff --git a/libstdc++-v3/testsuite/23_containers/queue/requirements/explicit_instantiation/1_c++98.cc b/libstdc++-v3/testsuite/23_containers/queue/requirements/explicit_instantiation/1_c++98.cc new file mode 100644 index 00000000000..4590220af2b --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/queue/requirements/explicit_instantiation/1_c++98.cc @@ -0,0 +1,30 @@ +// { dg-options "-std=gnu++98" } +// { dg-do compile } + +// Copyright (C) 2009-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 +// . + +// This file tests explicit instantiation of library containers. + +#include + +template class std::queue; + +struct NonDefaultConstructible : std::deque { + NonDefaultConstructible(int) { } +}; +template class std::queue; 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 +// . + +// { dg-do run { target c++11 } } + +#include + +struct NoCopying : std::deque +{ + NoCopying() = default; + NoCopying(const NoCopying& x) : std::deque(x) + { throw std::bad_alloc(); } +}; + +void +test01() +{ + std::stack 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 template class std::stack; + +struct NonDefaultConstructible : std::deque { + NonDefaultConstructible(int) { } +}; +template class std::stack; 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++0x.cc deleted file mode 100644 index 033f02f9348..00000000000 --- a/libstdc++-v3/testsuite/23_containers/stack/requirements/explicit_instantiation/1_c++0x.cc +++ /dev/null @@ -1,24 +0,0 @@ -// { dg-do compile { target c++11 } } - -// Copyright (C) 2009-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 -// . - -// This file tests explicit instantiation of library containers. - -#include - -template class std::stack; diff --git a/libstdc++-v3/testsuite/23_containers/stack/requirements/explicit_instantiation/1_c++98.cc b/libstdc++-v3/testsuite/23_containers/stack/requirements/explicit_instantiation/1_c++98.cc new file mode 100644 index 00000000000..394d223f181 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/stack/requirements/explicit_instantiation/1_c++98.cc @@ -0,0 +1,30 @@ +// { dg-options "-std=gnu++98" } +// { dg-do compile } + +// Copyright (C) 2009-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 +// . + +// This file tests explicit instantiation of library containers. + +#include + +template class std::stack; + +struct NonDefaultConstructible : std::deque { + NonDefaultConstructible(int) { } +}; +template class std::stack;