From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 14724 invoked by alias); 12 Oct 2016 20:36:31 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 14707 invoked by uid 89); 12 Oct 2016 20:36:31 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: =?ISO-8859-1?Q?No, score=0.4 required=5.0 tests=AWL,BAYES_50,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,RCVD_IN_SORBS_SPAM,SPF_PASS autolearn=ham version=3.3.2 spammy=multiset, song, fran=c3=a7ois, Fran=c3=a7ois?= X-Spam-User: qpsmtpd, 2 recipients X-HELO: mail-qk0-f173.google.com Received: from mail-qk0-f173.google.com (HELO mail-qk0-f173.google.com) (209.85.220.173) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 12 Oct 2016 20:36:29 +0000 Received: by mail-qk0-f173.google.com with SMTP id o68so99833477qkf.3; Wed, 12 Oct 2016 13:36:29 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:subject:to:references:cc:from:message-id:date :user-agent:mime-version:in-reply-to; bh=Rky9VU+Ue9NFCswQlv7QyuRL8uDzLhufZQsFbG2H8/8=; b=J0D3dhZBk0e8F2ZK7XCUn/9iSz6FWTBqoMZCW+SbTEoQlKzkBVWuV75d0kNDq/PeoX O2hGUjsTcuW6JCODkUexfw24ctHWK8EdiOm9RyvRr4m5/Z8PELfnigGQiflvTArIRC8x nkZpc7YSoMQkmZ8zq7hZVrfOuG4jvYe/Kx2x++lid3wzYhmpAtI77uPCfjHtDtCt5hu8 12Z2vY+gmFcIucaKy+39/UAJyjDZm3RYeK0dIH9M12xWgCKXHFiiYPhN2tMbgTLFNlvv YhphDiA5ucFuMYXXcNugERiPWOf3PjGiYwz1lWlD4iIM2hKA2qMq7acaM68tQuQDlg1f psng== X-Gm-Message-State: AA6/9RnQ5zCPSxY5op+iVThsiMAnqUT4dz5IzDP46Eaz93bht+R4eHdZaP4A1RBj/C/TmA== X-Received: by 10.194.172.41 with SMTP id az9mr4104171wjc.105.1476304587624; Wed, 12 Oct 2016 13:36:27 -0700 (PDT) Received: from [192.168.0.23] (arf62-1-82-237-250-248.fbx.proxad.net. [82.237.250.248]) by smtp.googlemail.com with ESMTPSA id ux6sm4352217wjb.18.2016.10.12.13.36.26 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 12 Oct 2016 13:36:26 -0700 (PDT) Subject: Re: [PATCH] 77864 Fix noexcept conditions for map/set default constructors To: Tim Song References: <20161005115617.GA5501@redhat.com> <20161005121309.GM29482@redhat.com> <4d30deb3-8720-2aa6-d0f2-94f6fca44825@gmail.com> <20161006213408.GU29482@redhat.com> <60454696-88fc-d7c0-12f5-b0f7e960dba8@gmail.com> <20161009151451.GB25380@redhat.com> <3daba99f-0630-2daf-6975-d93cc4d0cd7b@gmail.com> Cc: Jonathan Wakely , libstdc++@gcc.gnu.org, gcc-patches From: =?UTF-8?Q?Fran=c3=a7ois_Dumont?= Message-ID: <7363dc77-9f64-f2f7-35ea-163f5486f66f@gmail.com> Date: Wed, 12 Oct 2016 20:36:00 -0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.3.0 MIME-Version: 1.0 In-Reply-To: Content-Type: multipart/mixed; boundary="------------44CA6C5C76AC566E54751213" X-SW-Source: 2016-10/txt/msg00961.txt.bz2 This is a multi-part message in MIME format. --------------44CA6C5C76AC566E54751213 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-length: 1627 On 10/10/2016 23:01, Tim Song wrote: > Trying again...with a few edits. > >> On Mon, Oct 10, 2016 at 3:24 PM, François Dumont >> wrote: >> >> @@ -602,24 +612,32 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION >> struct _Rb_tree_impl : public _Node_allocator >> { >> _Key_compare _M_key_compare; >> - _Rb_tree_node_base _M_header; >> + _Rb_header_node _M_header; >> +#if __cplusplus < 201103L >> size_type _M_node_count; // Keeps track of size of tree. >> +#else >> + size_type _M_node_count = 0; // Keeps track of size of tree. >> +#endif >> >> +#if __cplusplus < 201103L >> _Rb_tree_impl() >> - : _Node_allocator(), _M_key_compare(), _M_header(), >> - _M_node_count(0) >> - { _M_initialize(); } >> + : _M_node_count(0) >> + { } >> +#else >> + _Rb_tree_impl() = default; >> +#endif > > The default constructor of the associative containers is required to > value-initialize the comparator (see their synopses in > [map/set/multimap/multiset.overview]). I don't have latest Standard version so can't see the exact word but I find quite annoying that the Standard doesn't allow this simple implementation. I don't know if unodered containers have same kind of requirements for equal or hash functors but if so current implementation doesn't do this value initialization. So here is another attempt. This time it simply allows to have noexcept condition in one place and closer to where operations are being invoked. Ok to commit after tests ? François > > _Rb_tree_impl() = default; doesn't do that; it default-initializes the > comparator instead. > > Tim > --------------44CA6C5C76AC566E54751213 Content-Type: text/x-patch; name="default_dflt_const.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="default_dflt_const.patch" Content-length: 5476 diff --git a/libstdc++-v3/include/bits/stl_map.h b/libstdc++-v3/include/bits/stl_map.h index e5b2a1b..dea7d5b 100644 --- a/libstdc++-v3/include/bits/stl_map.h +++ b/libstdc++-v3/include/bits/stl_map.h @@ -167,11 +167,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER /** * @brief Default constructor creates no elements. */ - map() - _GLIBCXX_NOEXCEPT_IF( - is_nothrow_default_constructible::value - && is_nothrow_default_constructible::value) - : _M_t() { } +#if __cplusplus < 201103L + map() : _M_t() { } +#else + map() = default; +#endif /** * @brief Creates a %map with no elements. diff --git a/libstdc++-v3/include/bits/stl_multimap.h b/libstdc++-v3/include/bits/stl_multimap.h index d240427..7e86b76 100644 --- a/libstdc++-v3/include/bits/stl_multimap.h +++ b/libstdc++-v3/include/bits/stl_multimap.h @@ -164,11 +164,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER /** * @brief Default constructor creates no elements. */ - multimap() - _GLIBCXX_NOEXCEPT_IF( - is_nothrow_default_constructible::value - && is_nothrow_default_constructible::value) - : _M_t() { } +#if __cplusplus < 201103L + multimap() : _M_t() { } +#else + multimap() = default; +#endif /** * @brief Creates a %multimap with no elements. diff --git a/libstdc++-v3/include/bits/stl_multiset.h b/libstdc++-v3/include/bits/stl_multiset.h index cc068a9..7fe2fbd 100644 --- a/libstdc++-v3/include/bits/stl_multiset.h +++ b/libstdc++-v3/include/bits/stl_multiset.h @@ -144,11 +144,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER /** * @brief Default constructor creates no elements. */ - multiset() - _GLIBCXX_NOEXCEPT_IF( - is_nothrow_default_constructible::value - && is_nothrow_default_constructible::value) - : _M_t() { } +#if __cplusplus < 201103L + multiset() : _M_t() { } +#else + multiset() = default; +#endif /** * @brief Creates a %multiset with no elements. diff --git a/libstdc++-v3/include/bits/stl_set.h b/libstdc++-v3/include/bits/stl_set.h index 3938351..5ed9672 100644 --- a/libstdc++-v3/include/bits/stl_set.h +++ b/libstdc++-v3/include/bits/stl_set.h @@ -147,11 +147,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER /** * @brief Default constructor creates no elements. */ - set() - _GLIBCXX_NOEXCEPT_IF( - is_nothrow_default_constructible::value - && is_nothrow_default_constructible::value) - : _M_t() { } +#if __cplusplus < 201103L + set() : _M_t() { } +#else + set() = default; +#endif /** * @brief Creates a %set with no elements. diff --git a/libstdc++-v3/include/bits/stl_tree.h b/libstdc++-v3/include/bits/stl_tree.h index ee2dc70..b6a3c1e 100644 --- a/libstdc++-v3/include/bits/stl_tree.h +++ b/libstdc++-v3/include/bits/stl_tree.h @@ -137,6 +137,16 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } }; + struct _Rb_header_node : public _Rb_tree_node_base + { + _Rb_header_node() _GLIBCXX_NOEXCEPT + { + _M_color = _S_red; + _M_parent = _Base_ptr(); + _M_left = _M_right = this; + } + }; + template struct _Rb_tree_node : public _Rb_tree_node_base { @@ -602,24 +612,34 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION struct _Rb_tree_impl : public _Node_allocator { _Key_compare _M_key_compare; - _Rb_tree_node_base _M_header; + _Rb_header_node _M_header; +#if __cplusplus < 201103L size_type _M_node_count; // Keeps track of size of tree. +#else + size_type _M_node_count = 0; // Keeps track of size of tree. +#endif _Rb_tree_impl() - : _Node_allocator(), _M_key_compare(), _M_header(), - _M_node_count(0) - { _M_initialize(); } + _GLIBCXX_NOEXCEPT_IF( + is_nothrow_default_constructible<_Node_allocator>::value + && is_nothrow_default_constructible<_Key_compare>::value) + : _M_key_compare() +#if __cplusplus < 201103L + , _M_node_count(0) +#endif + { } _Rb_tree_impl(const _Key_compare& __comp, const _Node_allocator& __a) - : _Node_allocator(__a), _M_key_compare(__comp), _M_header(), - _M_node_count(0) - { _M_initialize(); } + : _Node_allocator(__a), _M_key_compare(__comp) +#if __cplusplus < 201103L + , _M_node_count(0) +#endif + { } #if __cplusplus >= 201103L _Rb_tree_impl(const _Key_compare& __comp, _Node_allocator&& __a) - : _Node_allocator(std::move(__a)), _M_key_compare(__comp), - _M_header(), _M_node_count(0) - { _M_initialize(); } + : _Node_allocator(std::move(__a)), _M_key_compare(__comp) + { } #endif void @@ -630,16 +650,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION this->_M_header._M_right = &this->_M_header; this->_M_node_count = 0; } - - private: - void - _M_initialize() - { - this->_M_header._M_color = _S_red; - this->_M_header._M_parent = 0; - this->_M_header._M_left = &this->_M_header; - this->_M_header._M_right = &this->_M_header; - } }; _Rb_tree_impl<_Compare> _M_impl; @@ -831,7 +841,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION public: // allocation/deallocation +#if __cplusplus < 201103L _Rb_tree() { } +#else + _Rb_tree() = default; +#endif _Rb_tree(const _Compare& __comp, const allocator_type& __a = allocator_type()) --------------44CA6C5C76AC566E54751213--