From patchwork Fri Sep 17 19:48:25 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jonathan Wakely X-Patchwork-Id: 45144 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 5DA34385780A for ; Fri, 17 Sep 2021 19:50:54 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 5DA34385780A DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1631908254; bh=AUqsC08OvA9SOmUx65wV2JPhC4wPbfSSiwoF6jaXMKY=; h=Date:To:Subject:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=CdJCEdZXK4wZkmCNPkg37fKy3Zh35++rOeQXMJ9wMnJZ+6XggaqUHb5eLWvFgBNga zmKmUQ+WaP4yyprFNVdpC2aWQkZW9UwFHZEeUUmg4vmn1kcXHDT2Sherp9XU+CA1QI fPcRtkg8Kt2wIiS6iBks1GFsAHFY7wZjk+z0prDU= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by sourceware.org (Postfix) with ESMTP id 63E9D385AC25 for ; Fri, 17 Sep 2021 19:48:30 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 63E9D385AC25 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-207-uFK2EMrDNvmRHfCW_PpmNQ-1; Fri, 17 Sep 2021 15:48:28 -0400 X-MC-Unique: uFK2EMrDNvmRHfCW_PpmNQ-1 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 95F9D91276; Fri, 17 Sep 2021 19:48:27 +0000 (UTC) Received: from localhost (unknown [10.33.36.240]) by smtp.corp.redhat.com (Postfix) with ESMTP id 104D826E77; Fri, 17 Sep 2021 19:48:25 +0000 (UTC) Date: Fri, 17 Sep 2021 20:48:25 +0100 To: libstdc++@gcc.gnu.org, gcc-patches@gcc.gnu.org Subject: [committed] libstdc++: Add 'noexcept' to path::iterator members Message-ID: MIME-Version: 1.0 X-Clacks-Overhead: GNU Terry Pratchett X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Disposition: inline X-Spam-Status: No, score=-14.8 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=unavailable autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Jonathan Wakely via Gcc-patches From: Jonathan Wakely Reply-To: Jonathan Wakely Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" All path::iterator operations are non-throwing. Signed-off-by: Jonathan Wakely libstdc++-v3/ChangeLog: * include/bits/fs_path.h (path::iterator): Add noexcept to all member functions and friend functions. (distance): Add noexcept. (advance): Add noexcept and inline. * include/experimental/bits/fs_path.h (path::iterator): Add noexcept to all member functions. Tested x86_64-linux. Committed to trunk. commit 42eff613d0c10f88dc7a44b14981876401a09981 Author: Jonathan Wakely Date: Fri Sep 17 12:28:35 2021 libstdc++: Add 'noexcept' to path::iterator members All path::iterator operations are non-throwing. Signed-off-by: Jonathan Wakely libstdc++-v3/ChangeLog: * include/bits/fs_path.h (path::iterator): Add noexcept to all member functions and friend functions. (distance): Add noexcept. (advance): Add noexcept and inline. * include/experimental/bits/fs_path.h (path::iterator): Add noexcept to all member functions. diff --git a/libstdc++-v3/include/bits/fs_path.h b/libstdc++-v3/include/bits/fs_path.h index 235d1df748f..92f7cbbe357 100644 --- a/libstdc++-v3/include/bits/fs_path.h +++ b/libstdc++-v3/include/bits/fs_path.h @@ -884,33 +884,42 @@ namespace __detail using pointer = const path*; using iterator_category = std::bidirectional_iterator_tag; - iterator() : _M_path(nullptr), _M_cur(), _M_at_end() { } + iterator() noexcept : _M_path(nullptr), _M_cur(), _M_at_end() { } iterator(const iterator&) = default; iterator& operator=(const iterator&) = default; - reference operator*() const; - pointer operator->() const { return std::__addressof(**this); } + reference operator*() const noexcept; + pointer operator->() const noexcept { return std::__addressof(**this); } - iterator& operator++(); - iterator operator++(int) { auto __tmp = *this; ++*this; return __tmp; } + iterator& operator++() noexcept; - iterator& operator--(); - iterator operator--(int) { auto __tmp = *this; --*this; return __tmp; } + iterator operator++(int) noexcept + { auto __tmp = *this; ++*this; return __tmp; } - friend bool operator==(const iterator& __lhs, const iterator& __rhs) + iterator& operator--() noexcept; + + iterator operator--(int) noexcept + { auto __tmp = *this; --*this; return __tmp; } + + friend bool + operator==(const iterator& __lhs, const iterator& __rhs) noexcept { return __lhs._M_equals(__rhs); } - friend bool operator!=(const iterator& __lhs, const iterator& __rhs) + friend bool + operator!=(const iterator& __lhs, const iterator& __rhs) noexcept { return !__lhs._M_equals(__rhs); } private: friend class path; - bool _M_is_multi() const { return _M_path->_M_type() == _Type::_Multi; } + bool + _M_is_multi() const noexcept + { return _M_path->_M_type() == _Type::_Multi; } friend difference_type __path_iter_distance(const iterator& __first, const iterator& __last) + noexcept { __glibcxx_assert(__first._M_path != nullptr); __glibcxx_assert(__first._M_path == __last._M_path); @@ -923,7 +932,7 @@ namespace __detail } friend void - __path_iter_advance(iterator& __i, difference_type __n) + __path_iter_advance(iterator& __i, difference_type __n) noexcept { if (__n == 1) ++__i; @@ -938,15 +947,15 @@ namespace __detail } } - iterator(const path* __path, path::_List::const_iterator __iter) + iterator(const path* __path, path::_List::const_iterator __iter) noexcept : _M_path(__path), _M_cur(__iter), _M_at_end() { } - iterator(const path* __path, bool __at_end) + iterator(const path* __path, bool __at_end) noexcept : _M_path(__path), _M_cur(), _M_at_end(__at_end) { } - bool _M_equals(iterator) const; + bool _M_equals(iterator) const noexcept; const path* _M_path; path::_List::const_iterator _M_cur; @@ -1266,7 +1275,7 @@ namespace __detail } inline path::iterator - path::begin() const + path::begin() const noexcept { if (_M_type() == _Type::_Multi) return iterator(this, _M_cmpts.begin()); @@ -1274,7 +1283,7 @@ namespace __detail } inline path::iterator - path::end() const + path::end() const noexcept { if (_M_type() == _Type::_Multi) return iterator(this, _M_cmpts.end()); @@ -1282,10 +1291,10 @@ namespace __detail } inline path::iterator& - path::iterator::operator++() + path::iterator::operator++() noexcept { __glibcxx_assert(_M_path != nullptr); - if (_M_path->_M_type() == _Type::_Multi) + if (_M_is_multi()) { __glibcxx_assert(_M_cur != _M_path->_M_cmpts.end()); ++_M_cur; @@ -1299,10 +1308,10 @@ namespace __detail } inline path::iterator& - path::iterator::operator--() + path::iterator::operator--() noexcept { __glibcxx_assert(_M_path != nullptr); - if (_M_path->_M_type() == _Type::_Multi) + if (_M_is_multi()) { __glibcxx_assert(_M_cur != _M_path->_M_cmpts.begin()); --_M_cur; @@ -1316,10 +1325,10 @@ namespace __detail } inline path::iterator::reference - path::iterator::operator*() const + path::iterator::operator*() const noexcept { __glibcxx_assert(_M_path != nullptr); - if (_M_path->_M_type() == _Type::_Multi) + if (_M_is_multi()) { __glibcxx_assert(_M_cur != _M_path->_M_cmpts.end()); return *_M_cur; @@ -1328,13 +1337,13 @@ namespace __detail } inline bool - path::iterator::_M_equals(iterator __rhs) const + path::iterator::_M_equals(iterator __rhs) const noexcept { if (_M_path != __rhs._M_path) return false; if (_M_path == nullptr) return true; - if (_M_path->_M_type() == path::_Type::_Multi) + if (_M_is_multi()) return _M_cur == __rhs._M_cur; return _M_at_end == __rhs._M_at_end; } @@ -1355,11 +1364,12 @@ _GLIBCXX_END_NAMESPACE_CXX11 inline ptrdiff_t distance(filesystem::path::iterator __first, filesystem::path::iterator __last) +noexcept { return __path_iter_distance(__first, __last); } template - void - advance(filesystem::path::iterator& __i, _Distance __n) + inline void + advance(filesystem::path::iterator& __i, _Distance __n) noexcept { __path_iter_advance(__i, static_cast(__n)); } extern template class __shared_ptr; diff --git a/libstdc++-v3/include/experimental/bits/fs_path.h b/libstdc++-v3/include/experimental/bits/fs_path.h index a2bc931c696..b26b84c37ab 100644 --- a/libstdc++-v3/include/experimental/bits/fs_path.h +++ b/libstdc++-v3/include/experimental/bits/fs_path.h @@ -864,38 +864,44 @@ namespace __detail using pointer = const path*; using iterator_category = std::bidirectional_iterator_tag; - iterator() : _M_path(nullptr), _M_cur(), _M_at_end() { } + iterator() noexcept : _M_path(nullptr), _M_cur(), _M_at_end() { } iterator(const iterator&) = default; iterator& operator=(const iterator&) = default; - reference operator*() const; - pointer operator->() const { return std::__addressof(**this); } + reference operator*() const noexcept; + pointer operator->() const noexcept { return std::__addressof(**this); } - iterator& operator++(); - iterator operator++(int) { auto __tmp = *this; ++*this; return __tmp; } + iterator& operator++() noexcept; - iterator& operator--(); - iterator operator--(int) { auto __tmp = *this; --*this; return __tmp; } + iterator operator++(int) noexcept + { auto __tmp = *this; ++*this; return __tmp; } - friend bool operator==(const iterator& __lhs, const iterator& __rhs) + iterator& operator--() noexcept; + + iterator operator--(int) noexcept + { auto __tmp = *this; --*this; return __tmp; } + + friend bool + operator==(const iterator& __lhs, const iterator& __rhs) noexcept { return __lhs._M_equals(__rhs); } - friend bool operator!=(const iterator& __lhs, const iterator& __rhs) + friend bool + operator!=(const iterator& __lhs, const iterator& __rhs) noexcept { return !__lhs._M_equals(__rhs); } private: friend class path; - iterator(const path* __path, path::_List::const_iterator __iter) + iterator(const path* __path, path::_List::const_iterator __iter) noexcept : _M_path(__path), _M_cur(__iter), _M_at_end() { } - iterator(const path* __path, bool __at_end) + iterator(const path* __path, bool __at_end) noexcept : _M_path(__path), _M_cur(), _M_at_end(__at_end) { } - bool _M_equals(iterator) const; + bool _M_equals(iterator) const noexcept; const path* _M_path; path::_List::const_iterator _M_cur; @@ -1206,7 +1212,7 @@ namespace __detail } inline path::iterator - path::begin() const + path::begin() const noexcept { if (_M_type == _Type::_Multi) return iterator(this, _M_cmpts.begin()); @@ -1214,7 +1220,7 @@ namespace __detail } inline path::iterator - path::end() const + path::end() const noexcept { if (_M_type == _Type::_Multi) return iterator(this, _M_cmpts.end()); @@ -1222,7 +1228,7 @@ namespace __detail } inline path::iterator& - path::iterator::operator++() + path::iterator::operator++() noexcept { __glibcxx_assert(_M_path != nullptr); if (_M_path->_M_type == _Type::_Multi) @@ -1239,7 +1245,7 @@ namespace __detail } inline path::iterator& - path::iterator::operator--() + path::iterator::operator--() noexcept { __glibcxx_assert(_M_path != nullptr); if (_M_path->_M_type == _Type::_Multi) @@ -1256,7 +1262,7 @@ namespace __detail } inline path::iterator::reference - path::iterator::operator*() const + path::iterator::operator*() const noexcept { __glibcxx_assert(_M_path != nullptr); if (_M_path->_M_type == _Type::_Multi) @@ -1268,7 +1274,7 @@ namespace __detail } inline bool - path::iterator::_M_equals(iterator __rhs) const + path::iterator::_M_equals(iterator __rhs) const noexcept { if (_M_path != __rhs._M_path) return false;