+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
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:
/**
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>>
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:
/**
: 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)
{ 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); }
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
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>>
--- /dev/null
+// 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();
+}
#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>;
+++ /dev/null
-// { 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>;
--- /dev/null
+// { 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>;
--- /dev/null
+// 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();
+}
#include <queue>
template class std::queue<int>;
+
+struct NonDefaultConstructible : std::deque<int> {
+ NonDefaultConstructible(int) { }
+};
+template class std::queue<int, NonDefaultConstructible>;
+++ /dev/null
-// { 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>;
--- /dev/null
+// { 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>;
--- /dev/null
+// 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();
+}
#include <stack>
template class std::stack<int>;
+
+struct NonDefaultConstructible : std::deque<int> {
+ NonDefaultConstructible(int) { }
+};
+template class std::stack<int, NonDefaultConstructible>;
+++ /dev/null
-// { 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>;
--- /dev/null
+// { 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>;