This undoes the recent change to make the containers' default constructors explicit, and makes the Debug Mode and Profile Mode associative containers consistent with normal mode.
The new C++11 containers (forward_list and unordered_*) still have explicit default constructors, which is probably wrong, but they weren't changed recently so that isn't a regression and can wait for the resolution of LWG issue 2193. Tested x86_64-linux, committed to trunk.
commit 3bc097d1f765fb323cf9ed61b4096b2a255a4cf8 Author: Jonathan Wakely <jwak...@redhat.com> Date: Wed Jan 22 16:41:27 2014 +0000 PR libstdc++/58764 * include/bits/stl_deque.h (deque::deque(const allocator_type&): Split into separate default constructor and constructor taking allocator. * include/bits/stl_list.h (list::list(const allocator_type&): Likewise. * include/bits/stl_vector.h (vector::vector(const allocator_type&): Likewise. * include/debug/deque (deque::deque(const allocator_type&)): Likewise. * include/debug/list (list::list(const _Allocator&)): Likewise. * include/debug/map.h (map::map(const _Compare&, const _Allocator&)): Likewise. * include/debug/multimap.h (multimap::multimap(const _Compare&, const _Allocator&)): Likewise. * include/debug/set.h (set::set(const _Compare&, const _Allocator&)): Likewise. * include/debug/multiset.h (multiset::multiset(const _Compare&, const _Allocator&)): Likewise. * include/debug/vector (vector::vector(const allocator_type&)): Likewise. * include/profile/deque (deque::deque(const _Allocator&)): Likewise. * include/profile/list (list::list(const _Allocator&)): Likewise. * include/profile/map.h (map::map(const _Compare&, const _Allocator&)): Likewise. * include/profile/multimap.h (multimap::multimap(const _Compare&, const _Allocator&)): Likewise. * include/profile/set.h (set::set(const _Compare&, const _Allocator&)): Likewise. * include/profile/multiset.h (multiset::multiset(const _Compare&, const _Allocator&)): Likewise. * include/profile/vector (vector::vector(const _Allocator&)): Likewise. * testsuite/23_containers/deque/58764.cc: New. * testsuite/23_containers/list/58764.cc: New. * testsuite/23_containers/map/58764.cc: New. * testsuite/23_containers/multimap/58764.cc: New. * testsuite/23_containers/set/58764.cc: New. * testsuite/23_containers/multiset/58764.cc: New. * testsuite/23_containers/vector/58764.cc: New. * testsuite/23_containers/deque/requirements/dr438/assign_neg.cc: Adjust dg-error line number. * testsuite/23_containers/deque/requirements/dr438/ constructor_1_neg.cc: Likewise. * testsuite/23_containers/deque/requirements/dr438/ constructor_2_neg.cc: Likewise. * testsuite/23_containers/deque/requirements/dr438/insert_neg.cc: Likewise. * testsuite/23_containers/list/requirements/dr438/assign_neg.cc: Likewise. * testsuite/23_containers/list/requirements/dr438/constructor_1_neg.cc: Likewise. * testsuite/23_containers/list/requirements/dr438/constructor_2_neg.cc: Likewise. * testsuite/23_containers/list/requirements/dr438/insert_neg.cc: Likewise. * testsuite/23_containers/vector/requirements/dr438/assign_neg.cc: Likewise. * testsuite/23_containers/vector/requirements/dr438/ constructor_1_neg.cc: Likewise. * testsuite/23_containers/vector/requirements/dr438/ constructor_2_neg.cc: Likewise. * testsuite/23_containers/vector/requirements/dr438/insert_neg.cc: Likewise. diff --git a/libstdc++-v3/include/bits/stl_deque.h b/libstdc++-v3/include/bits/stl_deque.h index 996c10f..0f4d0e9 100644 --- a/libstdc++-v3/include/bits/stl_deque.h +++ b/libstdc++-v3/include/bits/stl_deque.h @@ -781,12 +781,18 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER public: // [23.2.1.1] construct/copy/destroy // (assign() and get_allocator() are also listed in this section) + + /** + * @brief Creates a %deque with no elements. + */ + deque() : _Base() { } + /** * @brief Creates a %deque with no elements. * @param __a An allocator object. */ explicit - deque(const allocator_type& __a = allocator_type()) + deque(const allocator_type& __a) : _Base(__a) { } #if __cplusplus >= 201103L diff --git a/libstdc++-v3/include/bits/stl_list.h b/libstdc++-v3/include/bits/stl_list.h index b5e6cc8..19bb189 100644 --- a/libstdc++-v3/include/bits/stl_list.h +++ b/libstdc++-v3/include/bits/stl_list.h @@ -526,12 +526,19 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER public: // [23.2.2.1] construct/copy/destroy // (assign() and get_allocator() are also listed in this section) + + /** + * @brief Creates a %list with no elements. + */ + list() _GLIBCXX_NOEXCEPT + : _Base() { } + /** * @brief Creates a %list with no elements. * @param __a An allocator object. */ explicit - list(const allocator_type& __a = allocator_type()) _GLIBCXX_NOEXCEPT + list(const allocator_type& __a) _GLIBCXX_NOEXCEPT : _Base(_Node_alloc_type(__a)) { } #if __cplusplus >= 201103L diff --git a/libstdc++-v3/include/bits/stl_vector.h b/libstdc++-v3/include/bits/stl_vector.h index 2cedd39..14284aa 100644 --- a/libstdc++-v3/include/bits/stl_vector.h +++ b/libstdc++-v3/include/bits/stl_vector.h @@ -242,12 +242,18 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER public: // [23.2.4.1] construct/copy/destroy // (assign() and get_allocator() are also listed in this section) + + /** + * @brief Creates a %vector with no elements. + */ + vector() _GLIBCXX_NOEXCEPT : _Base() { } + /** * @brief Creates a %vector with no elements. * @param __a An allocator object. */ explicit - vector(const allocator_type& __a = allocator_type()) _GLIBCXX_NOEXCEPT + vector(const allocator_type& __a) _GLIBCXX_NOEXCEPT : _Base(__a) { } #if __cplusplus >= 201103L diff --git a/libstdc++-v3/include/debug/deque b/libstdc++-v3/include/debug/deque index f16d72c..225d06c 100644 --- a/libstdc++-v3/include/debug/deque +++ b/libstdc++-v3/include/debug/deque @@ -68,8 +68,11 @@ namespace __debug typedef std::reverse_iterator<const_iterator> const_reverse_iterator; // 23.2.1.1 construct/copy/destroy: + + deque() : _Base() { } + explicit - deque(const _Allocator& __a = _Allocator()) + deque(const _Allocator& __a) : _Base(__a) { } #if __cplusplus >= 201103L diff --git a/libstdc++-v3/include/debug/list b/libstdc++-v3/include/debug/list index 145f59d..9918bc5 100644 --- a/libstdc++-v3/include/debug/list +++ b/libstdc++-v3/include/debug/list @@ -69,8 +69,12 @@ namespace __debug typedef std::reverse_iterator<const_iterator> const_reverse_iterator; // 23.2.2.1 construct/copy/destroy: + + list() _GLIBCXX_NOEXCEPT + : _Base() { } + explicit - list(const _Allocator& __a = _Allocator()) _GLIBCXX_NOEXCEPT + list(const _Allocator& __a) _GLIBCXX_NOEXCEPT : _Base(__a) { } #if __cplusplus >= 201103L diff --git a/libstdc++-v3/include/debug/map.h b/libstdc++-v3/include/debug/map.h index 2367d57..bd68c99 100644 --- a/libstdc++-v3/include/debug/map.h +++ b/libstdc++-v3/include/debug/map.h @@ -77,7 +77,10 @@ namespace __debug typedef std::reverse_iterator<const_iterator> const_reverse_iterator; // 23.3.1.1 construct/copy/destroy: - explicit map(const _Compare& __comp = _Compare(), + + map() : _Base() { } + + explicit map(const _Compare& __comp, const _Allocator& __a = _Allocator()) : _Base(__comp, __a) { } diff --git a/libstdc++-v3/include/debug/multimap.h b/libstdc++-v3/include/debug/multimap.h index 0976573..fad80cc 100644 --- a/libstdc++-v3/include/debug/multimap.h +++ b/libstdc++-v3/include/debug/multimap.h @@ -78,7 +78,10 @@ namespace __debug typedef std::reverse_iterator<const_iterator> const_reverse_iterator; // 23.3.1.1 construct/copy/destroy: - explicit multimap(const _Compare& __comp = _Compare(), + + multimap() : _Base() { } + + explicit multimap(const _Compare& __comp, const _Allocator& __a = _Allocator()) : _Base(__comp, __a) { } diff --git a/libstdc++-v3/include/debug/multiset.h b/libstdc++-v3/include/debug/multiset.h index 5a39ef8..bd555b3 100644 --- a/libstdc++-v3/include/debug/multiset.h +++ b/libstdc++-v3/include/debug/multiset.h @@ -77,7 +77,10 @@ namespace __debug typedef std::reverse_iterator<const_iterator> const_reverse_iterator; // 23.3.3.1 construct/copy/destroy: - explicit multiset(const _Compare& __comp = _Compare(), + + multiset() : _Base() { } + + explicit multiset(const _Compare& __comp, const _Allocator& __a = _Allocator()) : _Base(__comp, __a) { } diff --git a/libstdc++-v3/include/debug/set.h b/libstdc++-v3/include/debug/set.h index 8c84f25..f40ecec 100644 --- a/libstdc++-v3/include/debug/set.h +++ b/libstdc++-v3/include/debug/set.h @@ -76,7 +76,10 @@ namespace __debug typedef std::reverse_iterator<const_iterator> const_reverse_iterator; // 23.3.3.1 construct/copy/destroy: - explicit set(const _Compare& __comp = _Compare(), + + set() : _Base() { } + + explicit set(const _Compare& __comp, const _Allocator& __a = _Allocator()) : _Base(__comp, __a) { } diff --git a/libstdc++-v3/include/debug/vector b/libstdc++-v3/include/debug/vector index 2b750d7..58d98ef 100644 --- a/libstdc++-v3/include/debug/vector +++ b/libstdc++-v3/include/debug/vector @@ -76,8 +76,12 @@ namespace __debug typedef std::reverse_iterator<const_iterator> const_reverse_iterator; // 23.2.4.1 construct/copy/destroy: + + vector() _GLIBCXX_NOEXCEPT + : _Base(), _M_guaranteed_capacity(0) { } + explicit - vector(const _Allocator& __a = _Allocator()) _GLIBCXX_NOEXCEPT + vector(const _Allocator& __a) _GLIBCXX_NOEXCEPT : _Base(__a), _M_guaranteed_capacity(0) { } #if __cplusplus >= 201103L diff --git a/libstdc++-v3/include/profile/deque b/libstdc++-v3/include/profile/deque index d6aa6bd..2c4f9cb 100644 --- a/libstdc++-v3/include/profile/deque +++ b/libstdc++-v3/include/profile/deque @@ -60,8 +60,12 @@ namespace __profile typedef typename _Base::const_pointer const_pointer; // 23.2.1.1 construct/copy/destroy: + + deque() + : _Base() { } + explicit - deque(const _Allocator& __a = _Allocator()) + deque(const _Allocator& __a) : _Base(__a) { } #if __cplusplus >= 201103L diff --git a/libstdc++-v3/include/profile/list b/libstdc++-v3/include/profile/list index c893320..87d99a0 100644 --- a/libstdc++-v3/include/profile/list +++ b/libstdc++-v3/include/profile/list @@ -64,8 +64,16 @@ template<typename _Tp, typename _Allocator = std::allocator<_Tp> > typedef std::reverse_iterator<const_iterator> const_reverse_iterator; // 23.2.2.1 construct/copy/destroy: + + list() _GLIBCXX_NOEXCEPT + : _Base() + { + __profcxx_list_construct(this); // list2slist + __profcxx_list_construct2(this); // list2vector + } + explicit - list(const _Allocator& __a = _Allocator()) _GLIBCXX_NOEXCEPT + list(const _Allocator& __a) _GLIBCXX_NOEXCEPT : _Base(__a) { __profcxx_list_construct(this); // list2slist diff --git a/libstdc++-v3/include/profile/map.h b/libstdc++-v3/include/profile/map.h index 63fb0cb..6a3160b 100644 --- a/libstdc++-v3/include/profile/map.h +++ b/libstdc++-v3/include/profile/map.h @@ -67,8 +67,13 @@ namespace __profile typedef std::reverse_iterator<const_iterator> const_reverse_iterator; // 23.3.1.1 construct/copy/destroy: + + map() + : _Base() + { __profcxx_map_to_unordered_map_construct(this); } + explicit - map(const _Compare& __comp = _Compare(), + map(const _Compare& __comp, const _Allocator& __a = _Allocator()) : _Base(__comp, __a) { __profcxx_map_to_unordered_map_construct(this); } diff --git a/libstdc++-v3/include/profile/multimap.h b/libstdc++-v3/include/profile/multimap.h index 4a703ce3..5ba5355 100644 --- a/libstdc++-v3/include/profile/multimap.h +++ b/libstdc++-v3/include/profile/multimap.h @@ -68,7 +68,11 @@ namespace __profile typedef typename _Base::const_pointer const_pointer; // 23.3.1.1 construct/copy/destroy: - explicit multimap(const _Compare& __comp = _Compare(), + + multimap() + : _Base() { } + + explicit multimap(const _Compare& __comp, const _Allocator& __a = _Allocator()) : _Base(__comp, __a) { } diff --git a/libstdc++-v3/include/profile/multiset.h b/libstdc++-v3/include/profile/multiset.h index 1719728..8ef6e6b 100644 --- a/libstdc++-v3/include/profile/multiset.h +++ b/libstdc++-v3/include/profile/multiset.h @@ -68,7 +68,11 @@ namespace __profile typedef typename _Base::const_pointer const_pointer; // 23.3.3.1 construct/copy/destroy: - explicit multiset(const _Compare& __comp = _Compare(), + + multiset() + : _Base() { } + + explicit multiset(const _Compare& __comp, const _Allocator& __a = _Allocator()) : _Base(__comp, __a) { } diff --git a/libstdc++-v3/include/profile/set.h b/libstdc++-v3/include/profile/set.h index 3b8fd55..05fbeb9 100644 --- a/libstdc++-v3/include/profile/set.h +++ b/libstdc++-v3/include/profile/set.h @@ -68,7 +68,11 @@ namespace __profile typedef typename _Base::const_pointer const_pointer; // 23.3.3.1 construct/copy/destroy: - explicit set(const _Compare& __comp = _Compare(), + + set() + : _Base() { } + + explicit set(const _Compare& __comp, const _Allocator& __a = _Allocator()) : _Base(__comp, __a) { } diff --git a/libstdc++-v3/include/profile/vector b/libstdc++-v3/include/profile/vector index a286ac5..5c2c621 100644 --- a/libstdc++-v3/include/profile/vector +++ b/libstdc++-v3/include/profile/vector @@ -77,8 +77,16 @@ namespace __profile _M_base() const _GLIBCXX_NOEXCEPT { return *this; } // 23.2.4.1 construct/copy/destroy: + + vector() _GLIBCXX_NOEXCEPT + : _Base() + { + __profcxx_vector_construct(this, this->capacity()); + __profcxx_vector_construct2(this); + } + explicit - vector(const _Allocator& __a = _Allocator()) _GLIBCXX_NOEXCEPT + vector(const _Allocator& __a) _GLIBCXX_NOEXCEPT : _Base(__a) { __profcxx_vector_construct(this, this->capacity()); diff --git a/libstdc++-v3/testsuite/23_containers/deque/58764.cc b/libstdc++-v3/testsuite/23_containers/deque/58764.cc new file mode 100644 index 0000000..a1056aa --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/deque/58764.cc @@ -0,0 +1,28 @@ +// Copyright (C) 2014 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 compile } +// { dg-options "-std=gnu++11" } + +// libstdc++/58764 + +#include <deque> + +void test01() +{ + std::deque<int> a = {}; +} diff --git a/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/assign_neg.cc b/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/assign_neg.cc index b4d2c80..4de8f2d 100644 --- a/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/assign_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/assign_neg.cc @@ -18,7 +18,7 @@ // <http://www.gnu.org/licenses/>. // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1758 } +// { dg-error "no matching" "" { target *-*-* } 1764 } #include <deque> diff --git a/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_1_neg.cc b/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_1_neg.cc index bfa6692..41f2905 100644 --- a/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_1_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_1_neg.cc @@ -18,7 +18,7 @@ // <http://www.gnu.org/licenses/>. // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1691 } +// { dg-error "no matching" "" { target *-*-* } 1697 } #include <deque> diff --git a/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_2_neg.cc b/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_2_neg.cc index 9a05437..f77b126 100644 --- a/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_2_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_2_neg.cc @@ -18,7 +18,7 @@ // <http://www.gnu.org/licenses/>. // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1691 } +// { dg-error "no matching" "" { target *-*-* } 1697 } #include <deque> #include <utility> diff --git a/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/insert_neg.cc b/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/insert_neg.cc index d2bb0fb..e7d5b1e 100644 --- a/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/insert_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/insert_neg.cc @@ -18,7 +18,7 @@ // <http://www.gnu.org/licenses/>. // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1842 } +// { dg-error "no matching" "" { target *-*-* } 1848 } #include <deque> diff --git a/libstdc++-v3/testsuite/23_containers/list/58764.cc b/libstdc++-v3/testsuite/23_containers/list/58764.cc new file mode 100644 index 0000000..c523e02 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/list/58764.cc @@ -0,0 +1,28 @@ +// Copyright (C) 2014 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 compile } +// { dg-options "-std=gnu++11" } + +// libstdc++/58764 + +#include <list> + +void test01() +{ + std::list<int> a = {}; +} diff --git a/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/assign_neg.cc b/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/assign_neg.cc index 6dbf143..fed7829 100644 --- a/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/assign_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/assign_neg.cc @@ -18,7 +18,7 @@ // <http://www.gnu.org/licenses/>. // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1646 } +// { dg-error "no matching" "" { target *-*-* } 1653 } #include <list> diff --git a/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_1_neg.cc b/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_1_neg.cc index 915ecf4..f5eae4f 100644 --- a/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_1_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_1_neg.cc @@ -18,7 +18,7 @@ // <http://www.gnu.org/licenses/>. // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1598 } +// { dg-error "no matching" "" { target *-*-* } 1605 } #include <list> diff --git a/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_2_neg.cc b/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_2_neg.cc index 5c94805..e0fbe97 100644 --- a/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_2_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_2_neg.cc @@ -18,7 +18,7 @@ // <http://www.gnu.org/licenses/>. // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1598 } +// { dg-error "no matching" "" { target *-*-* } 1605 } #include <list> #include <utility> diff --git a/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/insert_neg.cc b/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/insert_neg.cc index 30ea0c4..3904624 100644 --- a/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/insert_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/insert_neg.cc @@ -18,7 +18,7 @@ // <http://www.gnu.org/licenses/>. // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1598 } +// { dg-error "no matching" "" { target *-*-* } 1605 } #include <list> diff --git a/libstdc++-v3/testsuite/23_containers/map/58764.cc b/libstdc++-v3/testsuite/23_containers/map/58764.cc new file mode 100644 index 0000000..31e0966 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/map/58764.cc @@ -0,0 +1,28 @@ +// Copyright (C) 2014 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 compile } +// { dg-options "-std=gnu++11" } + +// libstdc++/58764 + +#include <map> + +void test01() +{ + std::map<int, int> a = {}; +} diff --git a/libstdc++-v3/testsuite/23_containers/multimap/58764.cc b/libstdc++-v3/testsuite/23_containers/multimap/58764.cc new file mode 100644 index 0000000..4e85116 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/multimap/58764.cc @@ -0,0 +1,28 @@ +// Copyright (C) 2014 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 compile } +// { dg-options "-std=gnu++11" } + +// libstdc++/58764 + +#include <map> + +void test01() +{ + std::multimap<int, int> a = {}; +} diff --git a/libstdc++-v3/testsuite/23_containers/multiset/58764.cc b/libstdc++-v3/testsuite/23_containers/multiset/58764.cc new file mode 100644 index 0000000..f827923 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/multiset/58764.cc @@ -0,0 +1,28 @@ +// Copyright (C) 2014 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 compile } +// { dg-options "-std=gnu++11" } + +// libstdc++/58764 + +#include <set> + +void test01() +{ + std::multiset<int> a = {}; +} diff --git a/libstdc++-v3/testsuite/23_containers/set/58764.cc b/libstdc++-v3/testsuite/23_containers/set/58764.cc new file mode 100644 index 0000000..9a2ae3a --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/set/58764.cc @@ -0,0 +1,28 @@ +// Copyright (C) 2014 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 compile } +// { dg-options "-std=gnu++11" } + +// libstdc++/58764 + +#include <set> + +void test01() +{ + std::set<int> a = {}; +} diff --git a/libstdc++-v3/testsuite/23_containers/vector/58764.cc b/libstdc++-v3/testsuite/23_containers/vector/58764.cc new file mode 100644 index 0000000..6a9823c --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/vector/58764.cc @@ -0,0 +1,29 @@ +// Copyright (C) 2014 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 compile } +// { dg-options "-std=gnu++11" } + +// libstdc++/58764 + +#include <vector> + +void test01() +{ + std::vector<int> a = {}; + std::vector<bool> b = {}; +} diff --git a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/assign_neg.cc b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/assign_neg.cc index 158a902..cfbe734 100644 --- a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/assign_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/assign_neg.cc @@ -18,7 +18,7 @@ // <http://www.gnu.org/licenses/>. // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1306 } +// { dg-error "no matching" "" { target *-*-* } 1312 } #include <vector> diff --git a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc index cf186eb..88b6e0e 100644 --- a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc @@ -18,7 +18,7 @@ // <http://www.gnu.org/licenses/>. // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1232 } +// { dg-error "no matching" "" { target *-*-* } 1238 } #include <vector> diff --git a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc index cbbc1d3..94cc4ba 100644 --- a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc @@ -18,7 +18,7 @@ // <http://www.gnu.org/licenses/>. // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1232 } +// { dg-error "no matching" "" { target *-*-* } 1238 } #include <vector> #include <utility> diff --git a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/insert_neg.cc b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/insert_neg.cc index 8471a64..de61175 100644 --- a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/insert_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/insert_neg.cc @@ -18,7 +18,7 @@ // <http://www.gnu.org/licenses/>. // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1347 } +// { dg-error "no matching" "" { target *-*-* } 1353 } #include <vector> commit 422470c189acc42cfe7292e6f08a60412213334d Author: vmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4> Date: Wed Jan 22 19:38:47 2014 +0000 2014-01-22 Vladimir Makarov <vmaka...@redhat.com> PR rtl-optimization/59477 * lra-constraints.c (inherit_in_ebb): Process call for living hard regs. Update reloads_num and potential_reload_hard_regs for all insns. 2014-01-22 Vladimir Makarov <vmaka...@redhat.com> PR rtl-optimization/59477 * g++.dg/pr59477.C: New. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@206938 138bc75d-0d04-0410-961f-82ee72b054a4 diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c index dc5e59a..7454229 100644 --- a/gcc/lra-constraints.c +++ b/gcc/lra-constraints.c @@ -5007,7 +5007,7 @@ static bool inherit_in_ebb (rtx head, rtx tail) { int i, src_regno, dst_regno, nregs; - bool change_p, succ_p; + bool change_p, succ_p, update_reloads_num_p; rtx prev_insn, next_usage_insns, set, last_insn; enum reg_class cl; struct lra_insn_reg *reg; @@ -5078,6 +5078,7 @@ inherit_in_ebb (rtx head, rtx tail) src_regno = REGNO (SET_SRC (set)); dst_regno = REGNO (SET_DEST (set)); } + update_reloads_num_p = true; if (src_regno < lra_constraint_new_regno_start && src_regno >= FIRST_PSEUDO_REGISTER && reg_renumber[src_regno] < 0 @@ -5086,6 +5087,7 @@ inherit_in_ebb (rtx head, rtx tail) { /* 'reload_pseudo <- original_pseudo'. */ reloads_num++; + update_reloads_num_p = false; succ_p = false; if (usage_insns[src_regno].check == curr_usage_insns_check && (next_usage_insns = usage_insns[src_regno].insns) != NULL_RTX) @@ -5109,6 +5111,7 @@ inherit_in_ebb (rtx head, rtx tail) = usage_insns[dst_regno].insns) != NULL_RTX) { reloads_num++; + update_reloads_num_p = false; /* 'original_pseudo <- reload_pseudo'. */ if (! JUMP_P (curr_insn) && inherit_reload_reg (true, dst_regno, cl, @@ -5297,6 +5300,14 @@ inherit_in_ebb (rtx head, rtx tail) add_next_usage_insn (src_regno, use_insn, reloads_num); } } + /* Process call args. */ + if (curr_id->arg_hard_regs != NULL) + for (i = 0; (src_regno = curr_id->arg_hard_regs[i]) >= 0; i++) + if (src_regno < FIRST_PSEUDO_REGISTER) + { + SET_HARD_REG_BIT (live_hard_regs, src_regno); + add_next_usage_insn (src_regno, curr_insn, reloads_num); + } for (i = 0; i < to_inherit_num; i++) { src_regno = to_inherit[i].regno; @@ -5307,6 +5318,26 @@ inherit_in_ebb (rtx head, rtx tail) setup_next_usage_insn (src_regno, curr_insn, reloads_num, false); } } + if (update_reloads_num_p + && NONDEBUG_INSN_P (curr_insn) + && (set = single_set (curr_insn)) != NULL_RTX) + { + int regno = -1; + if ((REG_P (SET_DEST (set)) + && (regno = REGNO (SET_DEST (set))) >= lra_constraint_new_regno_start + && reg_renumber[regno] < 0 + && (cl = lra_get_allocno_class (regno)) != NO_REGS) + || (REG_P (SET_SRC (set)) + && (regno = REGNO (SET_SRC (set))) >= lra_constraint_new_regno_start + && reg_renumber[regno] < 0 + && (cl = lra_get_allocno_class (regno)) != NO_REGS)) + { + reloads_num++; + if (hard_reg_set_subset_p (reg_class_contents[cl], live_hard_regs)) + IOR_HARD_REG_SET (potential_reload_hard_regs, + reg_class_contents[cl]); + } + } /* We reached the start of the current basic block. */ if (prev_insn == NULL_RTX || prev_insn == PREV_INSN (head) || BLOCK_FOR_INSN (prev_insn) != curr_bb) diff --git a/gcc/testsuite/g++.dg/pr59477.C b/gcc/testsuite/g++.dg/pr59477.C new file mode 100644 index 0000000..788c751 --- /dev/null +++ b/gcc/testsuite/g++.dg/pr59477.C @@ -0,0 +1,24 @@ +/* { dg-do compile } */ +/* { dg-options "-O" } */ + +struct A +{ + unsigned *a, b; + A (unsigned x) : a (), b (x) {} +}; + +struct B +{ + B (int); + B (const B &) {} +}; + +B bar (B, B, A); +int v; + +void +foo () +{ + B c = 0; + bar (c, c, A (1ULL << v)); +}