From patchwork Thu Feb 23 21:14:48 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Fran=C3=A7ois_Dumont?= X-Patchwork-Id: 61084 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:5915:0:0:0:0:0 with SMTP id v21csp538107wrd; Thu, 23 Feb 2023 13:15:51 -0800 (PST) X-Google-Smtp-Source: AK7set+TetVjTPgkBpZb0Dols8XgB0A2jymPQ0unyq/qCSuHZjoOnHd3oGFYdLWQa73JPqIjlweW X-Received: by 2002:a05:6402:51d3:b0:4af:6e08:319 with SMTP id r19-20020a05640251d300b004af6e080319mr3881676edd.15.1677186951503; Thu, 23 Feb 2023 13:15:51 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1677186951; cv=none; d=google.com; s=arc-20160816; b=cldADB4X+LNski5nyyC2+57KO59tBgjTTr4ovtiyYdVwqg3dBlGYhk5bD61H6gz/Bi 4pjZmbYtjiPeYF9FvK3N7DMiqfERi4Dxy8Chvt/lPzq5CskM90B9WYKnTGEJTkBn5Ylp dm9slk8xGyaQYFOsm0+f5zK1PzX+eAq7GYbICqgSnqKvB/kDuHAbDmFFAB//DQvyjd2B t5P81HAmElGE+3/eOW+Keu1OF3bsumIniUCFCq5sbb6pYUGZf+eeR7lJ1jVGNOaPnc25 IKC1ewU111inYJL3X/mixvkM9HxY4XBWt9BgAIRcE2PJJpcTYcD5703x3IBXSedNuShQ sOIw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:from:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence:subject:cc:to :content-language:user-agent:mime-version:date:message-id :dmarc-filter:delivered-to:dkim-signature:dkim-filter; bh=mR4ACimufBx3NekLUblJq/C57F91ni2DUu350FLtasg=; b=edU06OETY7iiri5L8f133DikVVd1BErkinNAMN1eUWVjNGTZc4zzYv9Qg6/DbpLJp2 36lT5bdyDWy/CJP8vgI2ukNI/xLcu+GSRM+844+YAx/yXt+BJrR/lMIsFHcF4aLDmOXf sYe5UUDoqt1XjGtA/Y40+/x37+z11Qx12ua3uuQhwWYUsR9D8PayEfSc0+HciC8DlGJP S5ln2xBDeN+ZA4/w/EAFLhAdtFVKmazLyfGCBHGAmUfVJ+vVZJuJYLoSkz7iF0KK/ILV 2wo+HuxaaYzhDb+CHn8ghQZ0PpfwId53SJVQxQKDSddKNvDIRM0kvXI5yqdPIopgfb9e RPDA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=rN8beiK9; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id z13-20020aa7cf8d000000b004acc690bf26si14850343edx.490.2023.02.23.13.15.51 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Feb 2023 13:15:51 -0800 (PST) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) client-ip=2620:52:3:1:0:246e:9693:128c; Authentication-Results: mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=rN8beiK9; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 7699E3856975 for ; Thu, 23 Feb 2023 21:15:39 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 7699E3856975 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1677186939; bh=mR4ACimufBx3NekLUblJq/C57F91ni2DUu350FLtasg=; h=Date:To:Cc:Subject:List-Id:List-Unsubscribe:List-Archive: List-Post:List-Help:List-Subscribe:From:Reply-To:From; b=rN8beiK96hvu9WwuU6uRPA0Ju6y4fnkBKEzemN6h5ovQr0IzU52zSSyddD5hkAwzc p+v8j/uos42A0riQ7WUC0pXIrNPvIAd6eZnIjX4X8pcVrxQrFLjSQ382LJzCsePXeA CDkGuimni4PdBrSCi3xwnM9XKYu1vSs7D4zgJGpM= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-wr1-x42f.google.com (mail-wr1-x42f.google.com [IPv6:2a00:1450:4864:20::42f]) by sourceware.org (Postfix) with ESMTPS id BCCB13858C00; Thu, 23 Feb 2023 21:14:52 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org BCCB13858C00 Received: by mail-wr1-x42f.google.com with SMTP id l1so11594077wry.10; Thu, 23 Feb 2023 13:14:52 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=subject:from:cc:to:content-language:user-agent:mime-version:date :message-id:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=mR4ACimufBx3NekLUblJq/C57F91ni2DUu350FLtasg=; b=rz8ypjb3fSryoSL4Q/4eSP95T6r2jGtbkZSMRirCo9+LT/TUWU3k0K69Z7fUzaDeRP 1Aw3WOyaVIQyZ/aP+bGWPX44oVJV3w48Xm9MFoaCl0W30X8wRR3MC+VTf8G60OFEVyQo CbHscxP1Phs7Cs/R/SlPo64dgTWT9zcB3EIJGzKxgt+va2P2gzz72GVyOTmsP0p+RRTT amTBHYihuazaCaR17aknvURnVKKmP2FuGT8+JXzZiZSV9ceVwqvs6oW0SpNE0MPVZU+I Kq3LOvq1SYT29XKEHJbmKcFQ0xyr69ERXXDXP2+cpdEJggQmb3QoSldjTOk2HKRjF+Sc G1yQ== X-Gm-Message-State: AO0yUKXFBV4LxriHAcJ6JZCeZaxYxGy1E1Zi9vjo0rbDDrFhjCd4ab4B P0I7kc6Lj+OiaH3OToqzwgrjgNPiwtg= X-Received: by 2002:a5d:6d8c:0:b0:2c7:e48:8c87 with SMTP id l12-20020a5d6d8c000000b002c70e488c87mr5187220wrs.25.1677186890745; Thu, 23 Feb 2023 13:14:50 -0800 (PST) Received: from ?IPV6:2a01:e0a:1dc:b1c0:37a2:d8b0:66af:9996? ([2a01:e0a:1dc:b1c0:37a2:d8b0:66af:9996]) by smtp.googlemail.com with ESMTPSA id x13-20020a5d6b4d000000b002c6e8af1037sm14110541wrw.104.2023.02.23.13.14.48 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 23 Feb 2023 13:14:49 -0800 (PST) Message-ID: <860b46c8-fc2a-3024-5fd2-5130ca8c27c8@gmail.com> Date: Thu, 23 Feb 2023 22:14:48 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.7.1 Content-Language: fr To: "libstdc++@gcc.gnu.org" Cc: gcc-patches Subject: [PATCH] Fix std::unordered_map key range insertion X-Spam-Status: No, score=-11.0 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) 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: =?utf-8?q?Fran=C3=A7ois_Dumont_via_Gcc-patches?= From: =?utf-8?q?Fran=C3=A7ois_Dumont?= Reply-To: =?utf-8?q?Fran=C3=A7ois_Dumont?= Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org Sender: "Gcc-patches" X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1758657984823686250?= X-GMAIL-MSGID: =?utf-8?q?1758657984823686250?= Hi Based on my work on PR 96088 for std::map I imagine this use case of inserting a range of keys into an associative container. It behaves as operator[] by inserting a default value for each key. I wonder if the Standard says that it should work. Or maybe we want to support it ? I haven't checked if it used to work before we introduced the _ConvertToValueType type. I have no old enough gcc to do so. It is not supported by std::map neither, even without _ConvertToValueType so I guess it was not working for std::unordered_map prior to it. If it can be considered as a bug I'll create a PR. François diff --git a/libstdc++-v3/include/bits/hashtable_policy.h b/libstdc++-v3/include/bits/hashtable_policy.h index cce4e2844cf..4a89d0ee1c8 100644 --- a/libstdc++-v3/include/bits/hashtable_policy.h +++ b/libstdc++-v3/include/bits/hashtable_policy.h @@ -125,15 +125,15 @@ namespace __detail { return std::forward<_Kt>(__k); } }; - template - struct _ConvertToValueType<_Select1st, _Value> + template + struct _ConvertToValueType<_Select1st, std::pair<_Key, _Value>> { - constexpr _Value&& - operator()(_Value&& __x) const noexcept + constexpr std::pair<_Key, _Value>&& + operator()(std::pair<_Key, _Value>&& __x) const noexcept { return std::move(__x); } - constexpr const _Value& - operator()(const _Value& __x) const noexcept + constexpr const std::pair<_Key, _Value>& + operator()(const std::pair<_Key, _Value>& __x) const noexcept { return __x; } template @@ -145,6 +145,26 @@ namespace __detail constexpr const std::pair<_Kt, _Val>& operator()(const std::pair<_Kt, _Val>& __x) const noexcept { return __x; } + + template + using __is_cons = std::is_constructible<_Key, _Kt&&>; + + template + using _IFcons = std::enable_if<__is_cons<_Kt>::value>; + + template + using _IFconsp = typename _IFcons<_Kt>::type; + + template> + std::pair<_Kt, _Value> + operator()(_Kt&& __kt) const + { + return { + std::piecewise_construct, + std::forward_as_tuple(std::forward<_Kt>(__kt)), + std::tuple<>() + }; + } }; template diff --git a/libstdc++-v3/testsuite/23_containers/unordered_map/96088.cc b/libstdc++-v3/testsuite/23_containers/unordered_map/96088.cc index 754b529c67c..a3bf6ce5307 100644 --- a/libstdc++-v3/testsuite/23_containers/unordered_map/96088.cc +++ b/libstdc++-v3/testsuite/23_containers/unordered_map/96088.cc @@ -264,6 +264,28 @@ test03() } } +void +test04() +{ + const std::initializer_list strlst = + { "long_str_for_dynamic_allocating" }; + __gnu_test::counter::reset(); + std::unordered_map> um; + um.insert(strlst.begin(), strlst.end()); + VERIFY( um.size() == 1 ); + + VERIFY( __gnu_test::counter::count() == 3 ); + VERIFY( __gnu_test::counter::get()._M_increments == 3 ); + + um.insert(strlst.begin(), strlst.end()); + VERIFY( um.size() == 1 ); + + VERIFY( __gnu_test::counter::count() == 3 ); + VERIFY( __gnu_test::counter::get()._M_increments == 3 ); +} + int main() { @@ -274,5 +296,6 @@ main() test21(); test22(); test03(); + test04(); return 0; }