public inbox for libstdc++-cvs@sourceware.org
help / color / mirror / Atom feed
From: William Schmidt <wschmidt@gcc.gnu.org>
To: gcc-cvs@gcc.gnu.org, libstdc++-cvs@gcc.gnu.org
Subject: [gcc(refs/users/wschmidt/heads/builtins3)] libstdc++: Fix regression in hash containers
Date: Fri, 28 Aug 2020 20:02:43 +0000 (GMT)	[thread overview]
Message-ID: <20200828200243.860A73950C30@sourceware.org> (raw)

https://gcc.gnu.org/g:9f9c0549dd42e85e2500ca67cef89dddb142c0c7

commit 9f9c0549dd42e85e2500ca67cef89dddb142c0c7
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Wed Aug 26 17:30:31 2020 +0100

    libstdc++: Fix regression in hash containers
    
    A recent change altered the layout of EBO-helper base classes, resulting
    in an ambiguity when the hash function and equality predicate are the
    same type.
    
    This modifies the type of one of the base classes, so that we don't get
    two base classes of the same type.
    
    libstdc++-v3/ChangeLog:
    
            * include/bits/hashtable_policy.h (_Hash_code_base): Change
            index of _Hashtable_ebo_helper base class.
            * testsuite/23_containers/unordered_map/dup_types.cc: New test.

Diff:
---
 libstdc++-v3/include/bits/hashtable_policy.h       |  8 +++---
 .../23_containers/unordered_map/dup_types.cc       | 29 ++++++++++++++++++++++
 2 files changed, 33 insertions(+), 4 deletions(-)

diff --git a/libstdc++-v3/include/bits/hashtable_policy.h b/libstdc++-v3/include/bits/hashtable_policy.h
index 38bd5ae4e81..0109ef86a7b 100644
--- a/libstdc++-v3/include/bits/hashtable_policy.h
+++ b/libstdc++-v3/include/bits/hashtable_policy.h
@@ -1190,10 +1190,10 @@ namespace __detail
 	   typename _Hash, typename _RangeHash, typename _Unused>
     struct _Hash_code_base<_Key, _Value, _ExtractKey, _Hash, _RangeHash,
 			   _Unused, false>
-    : private _Hashtable_ebo_helper<0, _Hash>
+    : private _Hashtable_ebo_helper<1, _Hash>
     {
     private:
-      using __ebo_hash = _Hashtable_ebo_helper<0, _Hash>;
+      using __ebo_hash = _Hashtable_ebo_helper<1, _Hash>;
 
       // Gives the local iterator implementation access to _M_bucket_index().
       friend struct _Local_iterator_base<_Key, _Value, _ExtractKey,
@@ -1260,10 +1260,10 @@ namespace __detail
 	   typename _Hash, typename _RangeHash, typename _Unused>
     struct _Hash_code_base<_Key, _Value, _ExtractKey, _Hash, _RangeHash,
 			   _Unused, true>
-    : private _Hashtable_ebo_helper<0, _Hash>
+    : private _Hashtable_ebo_helper<1, _Hash>
     {
     private:
-      using __ebo_hash = _Hashtable_ebo_helper<0, _Hash>;
+      using __ebo_hash = _Hashtable_ebo_helper<1, _Hash>;
 
     public:
       typedef _Hash					hasher;
diff --git a/libstdc++-v3/testsuite/23_containers/unordered_map/dup_types.cc b/libstdc++-v3/testsuite/23_containers/unordered_map/dup_types.cc
new file mode 100644
index 00000000000..0a6053eca87
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/unordered_map/dup_types.cc
@@ -0,0 +1,29 @@
+// Copyright (C) 2020 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 { target c++11 } }
+
+#include <unordered_map>
+
+struct Evil : std::hash<int>, std::equal_to<int>
+{ };
+
+void test01()
+{
+  std::unordered_map<int, int, Evil, Evil> h;
+  (void) h.key_eq();
+}


                 reply	other threads:[~2020-08-28 20:02 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200828200243.860A73950C30@sourceware.org \
    --to=wschmidt@gcc.gnu.org \
    --cc=gcc-cvs@gcc.gnu.org \
    --cc=libstdc++-cvs@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).