Patch courtesy Richard Smith at Google: Fix bug in the implementation of std::map's operator[]. Construct an object of type value_type, rather than using std::make_pair, so as to allow mapped_type to have an *explicit* copy constructor.
See [map.access] (23.4.4.3)/5 for the corresponding standardese. Tested via bootstrap + test. Okay for trunk? Thanks, Ollie 2012-08-02 Ollie Wild <a...@google.com> Richard Smith <richardsm...@google.com> * include/bits/stl_map.h (operator[](key_type&&)): Replace std::make_pair with value_type. * testsuite/23_containers/map/operators/2.cc: New test.
diff --git a/libstdc++-v3/include/bits/stl_map.h b/libstdc++-v3/include/bits/stl_map.h index cfd478a..a3abdd4 100644 --- a/libstdc++-v3/include/bits/stl_map.h +++ b/libstdc++-v3/include/bits/stl_map.h @@ -475,7 +475,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER iterator __i = lower_bound(__k); // __i->first is greater than or equivalent to __k. if (__i == end() || key_comp()(__k, (*__i).first)) - __i = insert(__i, std::make_pair(std::move(__k), mapped_type())); + __i = insert(__i, value_type(std::move(__k), mapped_type())); return (*__i).second; } #endif diff --git a/libstdc++-v3/testsuite/23_containers/map/operators/2.cc b/libstdc++-v3/testsuite/23_containers/map/operators/2.cc new file mode 100644 index 0000000..ce633d7 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/map/operators/2.cc @@ -0,0 +1,38 @@ +// Copyright (C) 2012 +// 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/>. + +// 23.4.4 template class map + +// This test verifies that the value type of a map need not be default +// copyable. + +// { dg-do compile } +// { dg-options "-std=gnu++11" } + +#include <map> + +struct Mapped { + Mapped(); + explicit Mapped(const Mapped&); +}; + +Mapped & foo() +{ + std::map<int, Mapped> m; + return m[0]; +}