https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105717

            Bug ID: 105717
           Summary: [9/10/11/12/13 Regression] cannot create unordered_map
                    from range of types convertible to value_type
           Product: gcc
           Version: 13.0
            Status: UNCONFIRMED
          Keywords: rejects-valid
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: redi at gcc dot gnu.org
                CC: unassigned at gcc dot gnu.org
  Target Milestone: ---

+++ This bug was initially created as a clone of Bug #56112 +++

François observed that I fixed construction for PR 56112, but we still don't
support insertion of such types:

#include <unordered_map>
#include <utility>
#include <assert.h>

struct Key
{
  explicit Key(const int* p) : value(p) { }
  ~Key() { value = nullptr; }

  bool operator==(const Key& k) const
  { return *value == *k.value; }

  const int* value;
};

struct hash
{
  std::size_t operator()(const Key& k) const noexcept
  { return *k.value; }
};

struct S
{
  static int _count;

  int value;
  operator std::pair<const Key, int>() const
  {
    ++_count;
    return { Key(&value), value };
  }
};

int S::_count = 0;

int main()
{
    S s[1] = { {2} };
    std::unordered_map<Key, int, hash> m(s, s + 1);
    assert( S::_count == 1 );

    std::unordered_multimap<Key, int, hash> mm(s, s + 1);
    assert( S::_count == 2 );

    m.insert(s, s + 1);
    assert( S::_count == 3 );

    mm.insert(s, s + 1);
    assert( S::_count == 4 );
}


This worked in 4.7

Reply via email to