PR77528 add default constructors for container adaptors
authorJonathan Wakely <jwakely@redhat.com>
Tue, 10 Jan 2017 17:30:20 +0000 (17:30 +0000)
committerJonathan Wakely <redi@gcc.gnu.org>
Tue, 10 Jan 2017 17:30:20 +0000 (17:30 +0000)
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

15 files changed:
libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/stl_queue.h
libstdc++-v3/include/bits/stl_stack.h
libstdc++-v3/testsuite/23_containers/priority_queue/77528.cc [new file with mode: 0644]
libstdc++-v3/testsuite/23_containers/priority_queue/requirements/explicit_instantiation/1.cc
libstdc++-v3/testsuite/23_containers/priority_queue/requirements/explicit_instantiation/1_c++0x.cc [deleted file]
libstdc++-v3/testsuite/23_containers/priority_queue/requirements/explicit_instantiation/1_c++98.cc [new file with mode: 0644]
libstdc++-v3/testsuite/23_containers/queue/77528.cc [new file with mode: 0644]
libstdc++-v3/testsuite/23_containers/queue/requirements/explicit_instantiation/1.cc
libstdc++-v3/testsuite/23_containers/queue/requirements/explicit_instantiation/1_c++0x.cc [deleted file]
libstdc++-v3/testsuite/23_containers/queue/requirements/explicit_instantiation/1_c++98.cc [new file with mode: 0644]
libstdc++-v3/testsuite/23_containers/stack/77528.cc [new file with mode: 0644]
libstdc++-v3/testsuite/23_containers/stack/requirements/explicit_instantiation/1.cc
libstdc++-v3/testsuite/23_containers/stack/requirements/explicit_instantiation/1_c++0x.cc [deleted file]
libstdc++-v3/testsuite/23_containers/stack/requirements/explicit_instantiation/1_c++98.cc [new file with mode: 0644]

index b81ecc89f6a8bce085b7d07a9b4b64bc1140fcef..da1bfe65db9172b63d41ca50897233d918f23fc9 100644 (file)
@@ -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
index 45eba09078d063e1b5bd427646a705517a6052e9..6417b3067f6ca5c4ee79dcce19301d00443c1be0 100644 (file)
@@ -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); }
index f7020babb9cee9b36e76fb9b041bd96aa5953c8a..a0f9ee520dccfc0c8fd36e0643515a891f307ad1 100644 (file)
@@ -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 (file)
index 0000000..0f953bc
--- /dev/null
@@ -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();
+}
index 7795547ea5cae4c08f229b4e1cf5a7759623c05f..77cade0c0f65e1fb3549279a780c1be866b4df14 100644 (file)
 #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++0x.cc
deleted file mode 100644 (file)
index b4af733..0000000
+++ /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
-// <http://www.gnu.org/licenses/>.
-
-// This file tests explicit instantiation of library containers.
-
-#include <queue>
-
-template class std::priority_queue<int>;
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 (file)
index 0000000..0b5b287
--- /dev/null
@@ -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
+// <http://www.gnu.org/licenses/>.
+
+// This file tests explicit instantiation of library containers.
+
+#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 (file)
index 0000000..dff6d6d
--- /dev/null
@@ -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();
+}
index 7e49daebc91150369f6fcad32c9bc3007e484c91..503736557e54357c26d092354226f7a4664ddbb9 100644 (file)
@@ -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++0x.cc
deleted file mode 100644 (file)
index 71a9003..0000000
+++ /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
-// <http://www.gnu.org/licenses/>.
-
-// This file tests explicit instantiation of library containers.
-
-#include <queue>
-
-template class std::queue<int>;
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 (file)
index 0000000..4590220
--- /dev/null
@@ -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
+// <http://www.gnu.org/licenses/>.
+
+// This file tests explicit instantiation of library containers.
+
+#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 (file)
index 0000000..dfc3a2a
--- /dev/null
@@ -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();
+}
index fe90364c37092967247cc7115cda02dee81f64f8..b93286df1526edf5713462190b68adb57f868f93 100644 (file)
@@ -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++0x.cc
deleted file mode 100644 (file)
index 033f02f..0000000
+++ /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
-// <http://www.gnu.org/licenses/>.
-
-// This file tests explicit instantiation of library containers.
-
-#include <stack>
-
-template class std::stack<int>;
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 (file)
index 0000000..394d223
--- /dev/null
@@ -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
+// <http://www.gnu.org/licenses/>.
+
+// This file tests explicit instantiation of library containers.
+
+#include <stack>
+
+template class std::stack<int>;
+
+struct NonDefaultConstructible : std::deque<int> {
+  NonDefaultConstructible(int) { }
+};
+template class std::stack<int, NonDefaultConstructible>;