summaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
authorredi <redi@138bc75d-0d04-0410-961f-82ee72b054a4>2017-01-10 17:30:20 +0000
committerredi <redi@138bc75d-0d04-0410-961f-82ee72b054a4>2017-01-10 17:30:20 +0000
commitf81d9928805b94d9f95113849c8b9f62ce88b3ea (patch)
treeeec6350cf193eac941b657624a89f5b22b96b405 /libstdc++-v3
parentb386d8a161feb82100699969615d77e52ff47fff (diff)
downloadgcc-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')
-rw-r--r--libstdc++-v3/ChangeLog34
-rw-r--r--libstdc++-v3/include/bits/stl_queue.h29
-rw-r--r--libstdc++-v3/include/bits/stl_stack.h8
-rw-r--r--libstdc++-v3/testsuite/23_containers/priority_queue/77528.cc39
-rw-r--r--libstdc++-v3/testsuite/23_containers/priority_queue/requirements/explicit_instantiation/1.cc8
-rw-r--r--libstdc++-v3/testsuite/23_containers/priority_queue/requirements/explicit_instantiation/1_c++98.cc (renamed from libstdc++-v3/testsuite/23_containers/priority_queue/requirements/explicit_instantiation/1_c++0x.cc)11
-rw-r--r--libstdc++-v3/testsuite/23_containers/queue/77528.cc39
-rw-r--r--libstdc++-v3/testsuite/23_containers/queue/requirements/explicit_instantiation/1.cc5
-rw-r--r--libstdc++-v3/testsuite/23_containers/queue/requirements/explicit_instantiation/1_c++98.cc (renamed from libstdc++-v3/testsuite/23_containers/queue/requirements/explicit_instantiation/1_c++0x.cc)8
-rw-r--r--libstdc++-v3/testsuite/23_containers/stack/77528.cc39
-rw-r--r--libstdc++-v3/testsuite/23_containers/stack/requirements/explicit_instantiation/1.cc5
-rw-r--r--libstdc++-v3/testsuite/23_containers/stack/requirements/explicit_instantiation/1_c++98.cc (renamed from libstdc++-v3/testsuite/23_containers/stack/requirements/explicit_instantiation/1_c++0x.cc)8
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>;