From patchwork Fri May 10 14:17:27 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Carlini X-Patchwork-Id: 242993 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "localhost", Issuer "www.qmailtoaster.com" (not verified)) by ozlabs.org (Postfix) with ESMTPS id 6C6B82C00B6 for ; Sat, 11 May 2013 00:17:48 +1000 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :message-id:date:from:mime-version:to:cc:subject:content-type; q=dns; s=default; b=e9sZVpqxKFAVT1jakROAmrI4HXdtgATotFe9ReeyMUK /SWHH+j8iCA206ITvBAbfZVGS6SmrVuxdqB1QF7grZyItberOdIc/3MOkGydr4YB EPvmzJ0bk01lR/k82xiTCpluL3k1raf1I7ZF6u6sJHTNCvSq9/tAByZpvogU1qG8 = DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :message-id:date:from:mime-version:to:cc:subject:content-type; s=default; bh=K9f09Dps6chFPdCe7fG82uEad/4=; b=m9bNkHuPdU4vWpKHf FN8qIMYtCRYCnZEtVN9t8y/C/OK3Y3YU8eOt4LoOQGKL/iKS7XJaUO7kSDdd3nHY HrKp/+0ep59whfmiqzzzu045b2a9dRuQyU4lpe65cT5KyfpKVuwbnRWvTFSN+Aah +jmZ+46Sv2zIWMV/UnAk0Dg+fc= Received: (qmail 8272 invoked by alias); 10 May 2013 14:17:41 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 8173 invoked by uid 89); 10 May 2013 14:17:38 -0000 X-Spam-SWARE-Status: No, score=-6.0 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_MED, RCVD_IN_HOSTKARMA_NO, RCVD_IN_HOSTKARMA_YE, RP_MATCHES_RCVD, SPF_PASS, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-User: qpsmtpd, 2 recipients Received: from userp1040.oracle.com (HELO userp1040.oracle.com) (156.151.31.81) by sourceware.org (qpsmtpd/0.84/v0.84-167-ge50287c) with ESMTP; Fri, 10 May 2013 14:17:35 +0000 Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238]) by userp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r4AEHVeq013235 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 10 May 2013 14:17:32 GMT Received: from userz7022.oracle.com (userz7022.oracle.com [156.151.31.86]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r4AEHUhY024078 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Fri, 10 May 2013 14:17:31 GMT Received: from abhmt108.oracle.com (abhmt108.oracle.com [141.146.116.60]) by userz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r4AEHUNL011403; Fri, 10 May 2013 14:17:30 GMT Received: from poldo4.casa (/79.25.196.241) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 10 May 2013 07:17:29 -0700 Message-ID: <518D0177.8090709@oracle.com> Date: Fri, 10 May 2013 16:17:27 +0200 From: Paolo Carlini User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130329 Thunderbird/17.0.5 MIME-Version: 1.0 To: "gcc-patches@gcc.gnu.org" CC: libstdc++ , Jonathan Wakely Subject: [v3] Fix libstdc++/54577 X-Virus-Found: No Hi, this is the issue about the signatures of the erase member functions of the sequence containers. Mostly rather straightfoward stuff within the limits of the current infrastructure: the various _M_const_case are normally simple enough, I only mention the rather ugly std::vector one, required otherwise an ext_pointer testcase fails: I suppose that handling these issues in a proper way will happen together with changing the vector::pointer typedef to the conforming: typedef typename _Alloc_traits::pointer pointer; and I suppose Jonathan has the issue "under control". Something similar is true for the other containers. Tested x86_64-linux. Thanks, Paolo. //////////////////////////// 2013-05-10 Paolo Carlini PR libstdc++/54577 * include/bits/stl_deque.h (erase): Fix signatures in C++11 mode. (_Deque_iterator<>::_M_const_cast): Add. (deque<>::_M_erase): Declare. * include/bits/deque.tcc: ... and define. * include/bits/stl_list.h (erase): Fix signatures in C++11 mode. (_List_const_iterator<>::_M_const_cast): Add. * include/bits/list.tcc (erase (iterator)): Fix. * include/bits/stl_iterator.h (__normal_iterator<>::_M_const_cast): Add; include . * include/bits/stl_vector.h (erase): Fix signatures in C++11 mode. (vector<>::_M_erase): Declare. * include/bits/stl_bvector.h: Likewise. * include/bits/vector.tcc (vector<>::_M_erase): Define. * include/ext/vstring.h (erase): Fix signatures in C++11 mode. * include/debug/deque: Adjust. * include/debug/list: Likewise. * include/debug/vector: Likewise. * include/profile/deque: Likewise. * include/profile/list: Likewise. * include/profile/vector: Likewise. * testsuite/util/exception/safety.h (erase_base, erase_base, erase_base): Remove. (erase_base<__versa_string>): Update. * testsuite/ext/vstring/modifiers/char/54577.cc: New. * testsuite/ext/vstring/modifiers/wchar_t/54577.cc: Likewise. * testsuite/23_containers/deque/modifiers/erase/54577.cc: Likewise. * testsuite/23_containers/list/modifiers/erase/54577.cc: Likewise. * testsuite/23_containers/vector/bool/modifiers/erase/54577.cc: Likewise. * testsuite/23_containers/vector/modifiers/erase/54577.cc: Likewise. * testsuite/23_containers/deque/requirements/dr438/assign_neg.cc: Adjust dg-error line numbers. * 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. Index: include/bits/deque.tcc =================================================================== --- include/bits/deque.tcc (revision 198770) +++ include/bits/deque.tcc (working copy) @@ -191,7 +191,7 @@ template typename deque<_Tp, _Alloc>::iterator deque<_Tp, _Alloc>:: - erase(iterator __position) + _M_erase(iterator __position) { iterator __next = __position; ++__next; @@ -214,7 +214,7 @@ template typename deque<_Tp, _Alloc>::iterator deque<_Tp, _Alloc>:: - erase(iterator __first, iterator __last) + _M_erase(iterator __first, iterator __last) { if (__first == __last) return __first; Index: include/bits/list.tcc =================================================================== --- include/bits/list.tcc (revision 198770) +++ include/bits/list.tcc (working copy) @@ -106,10 +106,18 @@ template typename list<_Tp, _Alloc>::iterator list<_Tp, _Alloc>:: +#if __cplusplus >= 201103L + erase(const_iterator __position) +#else erase(iterator __position) +#endif { iterator __ret = iterator(__position._M_node->_M_next); +#if __cplusplus >= 201103L + _M_erase(__position._M_const_cast()); +#else _M_erase(__position); +#endif return __ret; } Index: include/bits/stl_bvector.h =================================================================== --- include/bits/stl_bvector.h (revision 198770) +++ include/bits/stl_bvector.h (working copy) @@ -308,6 +308,10 @@ _Bit_const_iterator(const _Bit_iterator& __x) : _Bit_iterator_base(__x._M_p, __x._M_offset) { } + _Bit_iterator + _M_const_cast() const + { return _Bit_iterator(_M_p, _M_offset); } + const_reference operator*() const { return _Bit_reference(_M_p, 1UL << _M_offset); } @@ -898,21 +902,22 @@ { --this->_M_impl._M_finish; } iterator +#if __cplusplus >= 201103L + erase(const_iterator __position) + { return _M_erase(__position._M_const_cast()); } +#else erase(iterator __position) - { - if (__position + 1 != end()) - std::copy(__position + 1, end(), __position); - --this->_M_impl._M_finish; - return __position; - } + { return _M_erase(__position); } +#endif iterator +#if __cplusplus >= 201103L + erase(const_iterator __first, const_iterator __last) + { return _M_erase(__first._M_const_cast(), __last._M_const_cast()); } +#else erase(iterator __first, iterator __last) - { - if (__first != __last) - _M_erase_at_end(std::copy(__last, end(), __first)); - return __first; - } + { return _M_erase(__first, __last); } +#endif void resize(size_type __new_size, bool __x = bool()) @@ -1124,6 +1129,12 @@ void _M_erase_at_end(iterator __pos) { this->_M_impl._M_finish = __pos; } + + iterator + _M_erase(iterator __pos); + + iterator + _M_erase(iterator __first, iterator __last); }; _GLIBCXX_END_NAMESPACE_CONTAINER Index: include/bits/stl_deque.h =================================================================== --- include/bits/stl_deque.h (revision 198770) +++ include/bits/stl_deque.h (working copy) @@ -136,6 +136,10 @@ : _M_cur(__x._M_cur), _M_first(__x._M_first), _M_last(__x._M_last), _M_node(__x._M_node) { } + iterator + _M_const_cast() const + { return iterator(_M_cur, _M_node); } + reference operator*() const { return *_M_cur; } @@ -1562,7 +1566,13 @@ * Managing the pointer is the user's responsibility. */ iterator - erase(iterator __position); +#if __cplusplus >= 201103L + erase(const_iterator __position) + { return _M_erase(__position._M_const_cast()); } +#else + erase(iterator __position) + { return _M_erase(__position); } +#endif /** * @brief Remove a range of elements. @@ -1581,7 +1591,13 @@ * way. Managing the pointer is the user's responsibility. */ iterator - erase(iterator __first, iterator __last); +#if __cplusplus >= 201103L + erase(const_iterator __first, const_iterator __last) + { return _M_erase(__first._M_const_cast(), __last._M_const_cast()); } +#else + erase(iterator __first, iterator __last) + { return _M_erase(__first, __last); } +#endif /** * @brief Swaps data with another %deque. @@ -1873,6 +1889,12 @@ this->_M_impl._M_finish = __pos; } + iterator + _M_erase(iterator __pos); + + iterator + _M_erase(iterator __first, iterator __last); + #if __cplusplus >= 201103L // Called by resize(sz). void Index: include/bits/stl_iterator.h =================================================================== --- include/bits/stl_iterator.h (revision 198770) +++ include/bits/stl_iterator.h (working copy) @@ -63,6 +63,7 @@ #include #include #include +#include namespace std _GLIBCXX_VISIBILITY(default) { @@ -733,6 +734,12 @@ _Container>::__type>& __i) : _M_current(__i.base()) { } + __normal_iterator + _M_const_cast() const + { return __normal_iterator + (__gnu_cxx::__const_pointer_cast + (_M_current)); } + // Forward iterator requirements reference operator*() const Index: include/bits/stl_list.h =================================================================== --- include/bits/stl_list.h (revision 198770) +++ include/bits/stl_list.h (working copy) @@ -219,6 +219,10 @@ _List_const_iterator(const iterator& __x) : _M_node(__x._M_node) { } + iterator + _M_const_cast() const + { return iterator(const_cast<__detail::_List_node_base*>(_M_node)); } + // Must downcast from List_node_base to _List_node to get to // _M_data. reference @@ -1169,7 +1173,11 @@ * any way. Managing the pointer is the user's responsibility. */ iterator +#if __cplusplus >= 201103L + erase(const_iterator __position); +#else erase(iterator __position); +#endif /** * @brief Remove a range of elements. @@ -1190,11 +1198,19 @@ * is the user's responsibility. */ iterator +#if __cplusplus >= 201103L + erase(const_iterator __first, const_iterator __last) +#else erase(iterator __first, iterator __last) +#endif { while (__first != __last) __first = erase(__first); +#if __cplusplus >= 201103L + return __last._M_const_cast(); +#else return __last; +#endif } /** Index: include/bits/stl_vector.h =================================================================== --- include/bits/stl_vector.h (revision 198770) +++ include/bits/stl_vector.h (working copy) @@ -1072,7 +1072,13 @@ * the pointer is the user's responsibility. */ iterator - erase(iterator __position); +#if __cplusplus >= 201103L + erase(const_iterator __position) + { return _M_erase(__position._M_const_cast()); } +#else + erase(iterator __position) + { return _M_erase(__position); } +#endif /** * @brief Remove a range of elements. @@ -1093,7 +1099,13 @@ * Managing the pointer is the user's responsibility. */ iterator - erase(iterator __first, iterator __last); +#if __cplusplus >= 201103L + erase(const_iterator __first, const_iterator __last) + { return _M_erase(__first._M_const_cast(), __last._M_const_cast()); } +#else + erase(iterator __first, iterator __last) + { return _M_erase(__first, __last); } +#endif /** * @brief Swaps data with another %vector. @@ -1353,6 +1365,12 @@ this->_M_impl._M_finish = __pos; } + iterator + _M_erase(iterator __position); + + iterator + _M_erase(iterator __first, iterator __last); + #if __cplusplus >= 201103L private: // Constant-time move assignment when source object's memory can be Index: include/bits/vector.tcc =================================================================== --- include/bits/vector.tcc (revision 198770) +++ include/bits/vector.tcc (working copy) @@ -132,7 +132,7 @@ template typename vector<_Tp, _Alloc>::iterator vector<_Tp, _Alloc>:: - erase(iterator __position) + _M_erase(iterator __position) { if (__position + 1 != end()) _GLIBCXX_MOVE3(__position + 1, end(), __position); @@ -144,7 +144,7 @@ template typename vector<_Tp, _Alloc>::iterator vector<_Tp, _Alloc>:: - erase(iterator __first, iterator __last) + _M_erase(iterator __first, iterator __last) { if (__first != __last) { @@ -790,6 +790,27 @@ } } + template + typename vector::iterator + vector:: + _M_erase(iterator __position) + { + if (__position + 1 != end()) + std::copy(__position + 1, end(), __position); + --this->_M_impl._M_finish; + return __position; + } + + template + typename vector::iterator + vector:: + _M_erase(iterator __first, iterator __last) + { + if (__first != __last) + _M_erase_at_end(std::copy(__last, end(), __first)); + return __first; + } + #if __cplusplus >= 201103L template bool Index: include/debug/deque =================================================================== --- include/debug/deque (revision 198770) +++ include/debug/deque (working copy) @@ -456,11 +456,19 @@ } iterator - erase(iterator __position) +#if __cplusplus >= 201103L + erase(const_iterator __position) +#else + erase(iterator __position) +#endif { __glibcxx_check_erase(__position); +#if __cplusplus >= 201103L + _Base_const_iterator __victim = __position.base(); +#else _Base_iterator __victim = __position.base(); - if (__victim == _Base::begin() || __victim == _Base::end()-1) +#endif + if (__victim == _Base::begin() || __victim == _Base::end() - 1) { this->_M_invalidate_if(_Equal(__victim)); return iterator(_Base::erase(__victim), this); @@ -474,19 +482,27 @@ } iterator +#if __cplusplus >= 201103L + erase(const_iterator __first, const_iterator __last) +#else erase(iterator __first, iterator __last) +#endif { // _GLIBCXX_RESOLVE_LIB_DEFECTS // 151. can't currently clear() empty container __glibcxx_check_erase_range(__first, __last); if (__first.base() == __last.base()) +#if __cplusplus >= 201103L + return iterator(__first.base()._M_const_cast(), this); +#else return __first; +#endif else if (__first.base() == _Base::begin() || __last.base() == _Base::end()) { this->_M_detach_singular(); - for (_Base_iterator __position = __first.base(); + for (_Base_const_iterator __position = __first.base(); __position != __last.base(); ++__position) { this->_M_invalidate_if(_Equal(__position)); Index: include/debug/list =================================================================== --- include/debug/list (revision 198770) +++ include/debug/list (working copy) @@ -431,35 +431,48 @@ private: _Base_iterator +#if __cplusplus >= 201103L + _M_erase(_Base_const_iterator __position) +#else _M_erase(_Base_iterator __position) +#endif { this->_M_invalidate_if(_Equal(__position)); return _Base::erase(__position); } + public: iterator +#if __cplusplus >= 201103L + erase(const_iterator __position) +#else erase(iterator __position) +#endif { __glibcxx_check_erase(__position); return iterator(_M_erase(__position.base()), this); } iterator - erase(iterator __position, iterator __last) +#if __cplusplus >= 201103L + erase(const_iterator __first, const_iterator __last) +#else + erase(iterator __first, iterator __last) +#endif { // _GLIBCXX_RESOLVE_LIB_DEFECTS // 151. can't currently clear() empty container - __glibcxx_check_erase_range(__position, __last); - for (_Base_iterator __victim = __position.base(); + __glibcxx_check_erase_range(__first, __last); + for (_Base_const_iterator __victim = __first.base(); __victim != __last.base(); ++__victim) { _GLIBCXX_DEBUG_VERIFY(__victim != _Base::end(), _M_message(__gnu_debug::__msg_valid_range) - ._M_iterator(__position, "position") + ._M_iterator(__first, "position") ._M_iterator(__last, "last")); this->_M_invalidate_if(_Equal(__victim)); } - return iterator(_Base::erase(__position.base(), __last.base()), this); + return iterator(_Base::erase(__first.base(), __last.base()), this); } void Index: include/debug/vector =================================================================== --- include/debug/vector (revision 198770) +++ include/debug/vector (working copy) @@ -514,7 +514,11 @@ } iterator +#if __cplusplus >= 201103L + erase(const_iterator __position) +#else erase(iterator __position) +#endif { __glibcxx_check_erase(__position); difference_type __offset = __position.base() - _Base::begin(); @@ -524,7 +528,11 @@ } iterator +#if __cplusplus >= 201103L + erase(const_iterator __first, const_iterator __last) +#else erase(iterator __first, iterator __last) +#endif { // _GLIBCXX_RESOLVE_LIB_DEFECTS // 151. can't currently clear() empty container @@ -539,7 +547,11 @@ return iterator(__res, this); } else +#if __cplusplus >= 201103L + return iterator(__first.base()._M_const_cast(), this); +#else return __first; +#endif } void Index: include/ext/vstring.h =================================================================== --- include/ext/vstring.h (revision 198770) +++ include/ext/vstring.h (working copy) @@ -1128,7 +1128,11 @@ * value of the string doesn't change if an error is thrown. */ iterator - erase(iterator __position) +#if __cplusplus >= 201103L + erase(const_iterator __position) +#else + erase(iterator __position) +#endif { _GLIBCXX_DEBUG_PEDASSERT(__position >= _M_ibegin() && __position < _M_iend()); @@ -1149,7 +1153,11 @@ * is thrown. */ iterator +#if __cplusplus >= 201103L + erase(const_iterator __first, const_iterator __last) +#else erase(iterator __first, iterator __last) +#endif { _GLIBCXX_DEBUG_PEDASSERT(__first >= _M_ibegin() && __first <= __last && __last <= _M_iend()); Index: include/profile/deque =================================================================== --- include/profile/deque (revision 198770) +++ include/profile/deque (working copy) @@ -379,25 +379,25 @@ } iterator - erase(iterator __position) +#if __cplusplus >= 201103L + erase(const_iterator __position) +#else + erase(iterator __position) +#endif { - if (__position == begin() || __position == end()-1) - { - return iterator(_Base::erase(__position)); - } - else - { - typename _Base::iterator __res = _Base::erase(__position); - return iterator(__res); - } + return _Base::erase(__position); } iterator +#if __cplusplus >= 201103L + erase(const_iterator __first, const_iterator __last) +#else erase(iterator __first, iterator __last) +#endif { // _GLIBCXX_RESOLVE_LIB_DEFECTS // 151. can't currently clear() empty container - return iterator(_Base::erase(__first, __last)); + return _Base::erase(__first, __last); } void Index: include/profile/list =================================================================== --- include/profile/list (revision 198770) +++ include/profile/list (working copy) @@ -389,11 +389,19 @@ } iterator +#if __cplusplus >= 201103L + erase(const_iterator __position) +#else erase(iterator __position) +#endif { return iterator(_Base::erase(__position.base()), this); } iterator +#if __cplusplus >= 201103L + erase(const_iterator __position, const_iterator __last) +#else erase(iterator __position, iterator __last) +#endif { // _GLIBCXX_RESOLVE_LIB_DEFECTS // 151. can't currently clear() empty container Index: include/profile/vector =================================================================== --- include/profile/vector (revision 198770) +++ include/profile/vector (working copy) @@ -425,14 +425,22 @@ iterator - erase(iterator __position) +#if __cplusplus >= 201103L + erase(const_iterator __position) +#else + erase(iterator __position) +#endif { typename _Base::iterator __res = _Base::erase(__position.base()); return iterator(__res, this); } iterator +#if __cplusplus >= 201103L + erase(const_iterator __first, const_iterator __last) +#else erase(iterator __first, iterator __last) +#endif { // _GLIBCXX_RESOLVE_LIB_DEFECTS // 151. can't currently clear() empty container Index: testsuite/23_containers/deque/modifiers/erase/54577.cc =================================================================== --- testsuite/23_containers/deque/modifiers/erase/54577.cc (revision 0) +++ testsuite/23_containers/deque/modifiers/erase/54577.cc (working copy) @@ -0,0 +1,33 @@ +// { dg-options "-std=gnu++11" } +// { dg-do compile } + +// Copyright (C) 2013 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 +// . + +#include + +void test01() +{ + std::deque d1; + d1.push_back(1); + d1.erase(d1.cbegin()); + + std::deque d2; + d2.push_back(2); + d2.push_back(3); + d2.erase(d2.cbegin(), d2.cend()); +} Index: testsuite/23_containers/deque/requirements/dr438/assign_neg.cc =================================================================== --- testsuite/23_containers/deque/requirements/dr438/assign_neg.cc (revision 198770) +++ testsuite/23_containers/deque/requirements/dr438/assign_neg.cc (working copy) @@ -18,7 +18,7 @@ // . // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1698 } +// { dg-error "no matching" "" { target *-*-* } 1714 } #include Index: testsuite/23_containers/deque/requirements/dr438/constructor_1_neg.cc =================================================================== --- testsuite/23_containers/deque/requirements/dr438/constructor_1_neg.cc (revision 198770) +++ testsuite/23_containers/deque/requirements/dr438/constructor_1_neg.cc (working copy) @@ -18,7 +18,7 @@ // . // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1631 } +// { dg-error "no matching" "" { target *-*-* } 1647 } #include Index: testsuite/23_containers/deque/requirements/dr438/constructor_2_neg.cc =================================================================== --- testsuite/23_containers/deque/requirements/dr438/constructor_2_neg.cc (revision 198770) +++ testsuite/23_containers/deque/requirements/dr438/constructor_2_neg.cc (working copy) @@ -18,7 +18,7 @@ // . // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1631 } +// { dg-error "no matching" "" { target *-*-* } 1647 } #include #include Index: testsuite/23_containers/deque/requirements/dr438/insert_neg.cc =================================================================== --- testsuite/23_containers/deque/requirements/dr438/insert_neg.cc (revision 198770) +++ testsuite/23_containers/deque/requirements/dr438/insert_neg.cc (working copy) @@ -18,7 +18,7 @@ // . // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1782 } +// { dg-error "no matching" "" { target *-*-* } 1798 } #include Index: testsuite/23_containers/list/modifiers/erase/54577.cc =================================================================== --- testsuite/23_containers/list/modifiers/erase/54577.cc (revision 0) +++ testsuite/23_containers/list/modifiers/erase/54577.cc (working copy) @@ -0,0 +1,33 @@ +// { dg-options "-std=gnu++11" } +// { dg-do compile } + +// Copyright (C) 2013 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 +// . + +#include + +void test01() +{ + std::list l1; + l1.push_back(1); + l1.erase(l1.cbegin()); + + std::list l2; + l2.push_back(2); + l2.push_back(3); + l2.erase(l2.cbegin(), l2.cend()); +} Index: testsuite/23_containers/list/requirements/dr438/assign_neg.cc =================================================================== --- testsuite/23_containers/list/requirements/dr438/assign_neg.cc (revision 198770) +++ testsuite/23_containers/list/requirements/dr438/assign_neg.cc (working copy) @@ -18,7 +18,7 @@ // . // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1529 } +// { dg-error "no matching" "" { target *-*-* } 1545 } #include Index: testsuite/23_containers/list/requirements/dr438/constructor_1_neg.cc =================================================================== --- testsuite/23_containers/list/requirements/dr438/constructor_1_neg.cc (revision 198770) +++ testsuite/23_containers/list/requirements/dr438/constructor_1_neg.cc (working copy) @@ -18,7 +18,7 @@ // . // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1481 } +// { dg-error "no matching" "" { target *-*-* } 1497 } #include Index: testsuite/23_containers/list/requirements/dr438/constructor_2_neg.cc =================================================================== --- testsuite/23_containers/list/requirements/dr438/constructor_2_neg.cc (revision 198770) +++ testsuite/23_containers/list/requirements/dr438/constructor_2_neg.cc (working copy) @@ -18,7 +18,7 @@ // . // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1481 } +// { dg-error "no matching" "" { target *-*-* } 1497 } #include #include Index: testsuite/23_containers/list/requirements/dr438/insert_neg.cc =================================================================== --- testsuite/23_containers/list/requirements/dr438/insert_neg.cc (revision 198770) +++ testsuite/23_containers/list/requirements/dr438/insert_neg.cc (working copy) @@ -18,7 +18,7 @@ // . // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1481 } +// { dg-error "no matching" "" { target *-*-* } 1497 } #include Index: testsuite/23_containers/vector/bool/modifiers/erase/54577.cc =================================================================== --- testsuite/23_containers/vector/bool/modifiers/erase/54577.cc (revision 0) +++ testsuite/23_containers/vector/bool/modifiers/erase/54577.cc (working copy) @@ -0,0 +1,33 @@ +// { dg-options "-std=gnu++11" } +// { dg-do compile } + +// Copyright (C) 2013 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 +// . + +#include + +void test01() +{ + std::vector vb1; + vb1.push_back(true); + vb1.erase(vb1.cbegin()); + + std::vector vb2; + vb2.push_back(false); + vb2.push_back(true); + vb2.erase(vb2.cbegin(), vb2.cend()); +} Index: testsuite/23_containers/vector/modifiers/erase/54577.cc =================================================================== --- testsuite/23_containers/vector/modifiers/erase/54577.cc (revision 0) +++ testsuite/23_containers/vector/modifiers/erase/54577.cc (working copy) @@ -0,0 +1,33 @@ +// { dg-options "-std=gnu++11" } +// { dg-do compile } + +// Copyright (C) 2013 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 +// . + +#include + +void test01() +{ + std::vector v1; + v1.push_back(1); + v1.erase(v1.cbegin()); + + std::vector v2; + v2.push_back(2); + v2.push_back(3); + v2.erase(v2.cbegin(), v2.cend()); +} Index: testsuite/23_containers/vector/requirements/dr438/assign_neg.cc =================================================================== --- testsuite/23_containers/vector/requirements/dr438/assign_neg.cc (revision 198770) +++ testsuite/23_containers/vector/requirements/dr438/assign_neg.cc (working copy) @@ -18,7 +18,7 @@ // . // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1240 } +// { dg-error "no matching" "" { target *-*-* } 1252 } #include Index: testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc =================================================================== --- testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc (revision 198770) +++ testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc (working copy) @@ -18,7 +18,7 @@ // . // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1166 } +// { dg-error "no matching" "" { target *-*-* } 1178 } #include Index: testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc =================================================================== --- testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc (revision 198770) +++ testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc (working copy) @@ -18,7 +18,7 @@ // . // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1166 } +// { dg-error "no matching" "" { target *-*-* } 1178 } #include #include Index: testsuite/23_containers/vector/requirements/dr438/insert_neg.cc =================================================================== --- testsuite/23_containers/vector/requirements/dr438/insert_neg.cc (revision 198770) +++ testsuite/23_containers/vector/requirements/dr438/insert_neg.cc (working copy) @@ -18,7 +18,7 @@ // . // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1281 } +// { dg-error "no matching" "" { target *-*-* } 1293 } #include Index: testsuite/ext/vstring/modifiers/char/54577.cc =================================================================== --- testsuite/ext/vstring/modifiers/char/54577.cc (revision 0) +++ testsuite/ext/vstring/modifiers/char/54577.cc (working copy) @@ -0,0 +1,33 @@ +// { dg-options "-std=gnu++11" } +// { dg-do compile } + +// Copyright (C) 2013 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 +// . + +#include + +void test01() +{ + __gnu_cxx::__vstring vs1; + vs1.push_back('1'); + vs1.erase(vs1.cbegin()); + + __gnu_cxx::__vstring vs2; + vs2.push_back('2'); + vs2.push_back('3'); + vs2.erase(vs2.cbegin(), vs2.cend()); +} Index: testsuite/ext/vstring/modifiers/wchar_t/54577.cc =================================================================== --- testsuite/ext/vstring/modifiers/wchar_t/54577.cc (revision 0) +++ testsuite/ext/vstring/modifiers/wchar_t/54577.cc (working copy) @@ -0,0 +1,33 @@ +// { dg-options "-std=gnu++11" } +// { dg-do compile } + +// Copyright (C) 2013 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 +// . + +#include + +void test01() +{ + __gnu_cxx::__wvstring wvs1; + wvs1.push_back(L'1'); + wvs1.erase(wvs1.cbegin()); + + __gnu_cxx::__wvstring wvs2; + wvs2.push_back(L'2'); + wvs2.push_back(L'3'); + wvs2.erase(wvs2.cbegin(), wvs2.cend()); +} Index: testsuite/util/exception/safety.h =================================================================== --- testsuite/util/exception/safety.h (revision 198770) +++ testsuite/util/exception/safety.h (working copy) @@ -287,57 +287,17 @@ typedef __gnu_cxx::__versa_string<_Tp1, _Tp2, _Tp3, _Tp4> container_type; typedef typename container_type::iterator iterator; + typedef typename container_type::const_iterator const_iterator; - iterator (container_type::* _F_erase_point)(iterator); - iterator (container_type::* _F_erase_range)(iterator, iterator); + iterator (container_type::* _F_erase_point)(const_iterator); + iterator (container_type::* _F_erase_range)(const_iterator, + const_iterator); erase_base() : _F_erase_point(&container_type::erase), _F_erase_range(&container_type::erase) { } }; - template - struct erase_base> - { - typedef std::deque<_Tp1, _Tp2> container_type; - typedef typename container_type::iterator iterator; - - iterator (container_type::* _F_erase_point)(iterator); - iterator (container_type::* _F_erase_range)(iterator, iterator); - - erase_base() - : _F_erase_point(&container_type::erase), - _F_erase_range(&container_type::erase) { } - }; - - template - struct erase_base> - { - typedef std::list<_Tp1, _Tp2> container_type; - typedef typename container_type::iterator iterator; - - iterator (container_type::* _F_erase_point)(iterator); - iterator (container_type::* _F_erase_range)(iterator, iterator); - - erase_base() - : _F_erase_point(&container_type::erase), - _F_erase_range(&container_type::erase) { } - }; - - template - struct erase_base> - { - typedef std::vector<_Tp1, _Tp2> container_type; - typedef typename container_type::iterator iterator; - - iterator (container_type::* _F_erase_point)(iterator); - iterator (container_type::* _F_erase_range)(iterator, iterator); - - erase_base() - : _F_erase_point(&container_type::erase), - _F_erase_range(&container_type::erase) { } - }; - // Specialization, as forward_list has erase_after. template struct erase_base>