[cfe-dev] Issue with map and unordered_map: call to deleted constructor of 'std::pair<const int, int>'

Matthieu Monrocq matthieu.monrocq at gmail.com
Sat Sep 17 13:12:51 PDT 2011


I just updated (and compiled) clang this afternoon, and a piece of code I
had written simply does not work any longer.

It boils down to the following code:

struct Foo {};

void foo(unsigned u) {
  std::unordered_map<unsigned, Foo> map;
  map.insert(std::make_pair(u, Foo())); // the offending line, also occurs
with a std::map
}

And I got a huge backtrace... eurk.

I managed to reduce the test case to:

#include <utility> // 1

template <typename V>
struct Node {
  V value;

  template <typename... Args>
  Node(Args&&... args): value(std::forward<Args>(args)...) {} // 8
};

void foo(std::pair<int const, int> const& p) {
  Node<std::pair<int const, int>> node(p); // 12
}

Where <utility> is picked up from the MinGW implementation of gcc 4.5.2. I
get this error:

unordered_map.cpp:8:25: error: call to deleted constructor of
'std::pair<const int, int>'
  Node(Args&&... args): value(std::forward<Args>(args)...) {}
                        ^     ~~~~~~~~~~~~~~~~~~~~~~~~
unordered_map.cpp:12:35: note: in instantiation of function template
specialization 'Node<std::pair<const int, int> >::Node<const std::pair<const
int, int> &>' requested here
  Node<std::pair<int const, int>> node(p);
                                  ^
/mingw/lib/gcc/mingw32/4.5.2/include/c++\bits/stl_pair.h:71:12: note:
function has been explicitly marked deleted here
    struct pair
           ^
1 error generated.

The full invocation (with the version of clang) and the preprocessed file
can be found in attachment, for those interested.

I was wondering if this is a bug in the gcc 4.5.2 standard library or a bug
in clang... and I'd really appreciate a work-around if anyone has one, since
I'm pretty much stuck at this point.

-- Matthieu
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20110917/98d06450/attachment.html>
-------------- next part --------------
$ clang -std=c++0x -fsyntax-only -v unordered_map.cpp
clang version 3.0 (trunk 139985)
Target: i686-pc-mingw32
Thread model: posix
 "d:/clang/rel-build-cmake/bin/clang.exe" -cc1 -triple i686-pc-mingw32 -fsyntax-only -disable-free -disable-llvm-verifier -main-file-name unordered_map.cpp -mrelocation-model static -mdisable-fp-elim
-mconstructor-aliases -target-cpu pentium4 -momit-leaf-frame-pointer -v -resource-dir d:/clang/rel-build-cmake/bin\..\lib\clang\3.0 -fmodule-cache-path C:/DOCUME~1/MyPC/LOCALS~1/Temp\clang-module-cach
e -std=c++0x -fdeprecated-macro -ferror-limit 19 -fmessage-length 200 -fno-use-cxa-atexit -fcxx-exceptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -x c++ unordered_map.cpp
clang -cc1 version 3.0 based upon llvm 3.0 hosted on i686-pc-mingw32
ignoring nonexistent directory "d:/clang/rel-build-cmake/bin\..\lib\clang\3.0/../../../include/c++/4.5.0"
ignoring nonexistent directory "d:/clang/rel-build-cmake/bin\..\lib\clang\3.0/../../../include/c++/4.5.0/x86_64-w64-mingw32"
ignoring nonexistent directory "d:/clang/rel-build-cmake/bin\..\lib\clang\3.0/../../../include/c++/4.5.0/i686-w64-mingw32"
ignoring nonexistent directory "d:/clang/rel-build-cmake/bin\..\lib\clang\3.0/../../../include/c++/4.5.0/backward"
ignoring nonexistent directory "d:/clang/rel-build-cmake/bin\..\lib\clang\3.0/../../../include/c++/4.5.1"
ignoring nonexistent directory "d:/clang/rel-build-cmake/bin\..\lib\clang\3.0/../../../include/c++/4.5.1/x86_64-w64-mingw32"
ignoring nonexistent directory "d:/clang/rel-build-cmake/bin\..\lib\clang\3.0/../../../include/c++/4.5.1/i686-w64-mingw32"
ignoring nonexistent directory "d:/clang/rel-build-cmake/bin\..\lib\clang\3.0/../../../include/c++/4.5.1/backward"
ignoring nonexistent directory "d:/clang/rel-build-cmake/bin\..\lib\clang\3.0/../../../include/c++/4.5.2"
ignoring nonexistent directory "d:/clang/rel-build-cmake/bin\..\lib\clang\3.0/../../../include/c++/4.5.2/x86_64-w64-mingw32"
ignoring nonexistent directory "d:/clang/rel-build-cmake/bin\..\lib\clang\3.0/../../../include/c++/4.5.2/i686-w64-mingw32"
ignoring nonexistent directory "d:/clang/rel-build-cmake/bin\..\lib\clang\3.0/../../../include/c++/4.5.2/backward"
ignoring nonexistent directory "d:/clang/rel-build-cmake/bin\..\lib\clang\3.0/../../../include/c++/4.5.3"
ignoring nonexistent directory "d:/clang/rel-build-cmake/bin\..\lib\clang\3.0/../../../include/c++/4.5.3/x86_64-w64-mingw32"
ignoring nonexistent directory "d:/clang/rel-build-cmake/bin\..\lib\clang\3.0/../../../include/c++/4.5.3/i686-w64-mingw32"
ignoring nonexistent directory "d:/clang/rel-build-cmake/bin\..\lib\clang\3.0/../../../include/c++/4.5.3/backward"
ignoring nonexistent directory "d:/clang/rel-build-cmake/bin\..\lib\clang\3.0/../../../include/c++/4.6.0"
ignoring nonexistent directory "d:/clang/rel-build-cmake/bin\..\lib\clang\3.0/../../../include/c++/4.6.0/x86_64-w64-mingw32"
ignoring nonexistent directory "d:/clang/rel-build-cmake/bin\..\lib\clang\3.0/../../../include/c++/4.6.0/i686-w64-mingw32"
ignoring nonexistent directory "d:/clang/rel-build-cmake/bin\..\lib\clang\3.0/../../../include/c++/4.6.0/backward"
ignoring nonexistent directory "d:/clang/rel-build-cmake/bin\..\lib\clang\3.0/../../../include/c++/4.6.1"
ignoring nonexistent directory "d:/clang/rel-build-cmake/bin\..\lib\clang\3.0/../../../include/c++/4.6.1/x86_64-w64-mingw32"
ignoring nonexistent directory "d:/clang/rel-build-cmake/bin\..\lib\clang\3.0/../../../include/c++/4.6.1/i686-w64-mingw32"
ignoring nonexistent directory "d:/clang/rel-build-cmake/bin\..\lib\clang\3.0/../../../include/c++/4.6.1/backward"
ignoring nonexistent directory "d:/clang/rel-build-cmake/bin\..\lib\clang\3.0/../../../include/c++/4.6.2"
ignoring nonexistent directory "d:/clang/rel-build-cmake/bin\..\lib\clang\3.0/../../../include/c++/4.6.2/x86_64-w64-mingw32"
ignoring nonexistent directory "d:/clang/rel-build-cmake/bin\..\lib\clang\3.0/../../../include/c++/4.6.2/i686-w64-mingw32"
ignoring nonexistent directory "d:/clang/rel-build-cmake/bin\..\lib\clang\3.0/../../../include/c++/4.6.2/backward"
ignoring nonexistent directory "d:/clang/rel-build-cmake/bin\..\lib\clang\3.0/../../../include/c++/4.7.0"
ignoring nonexistent directory "d:/clang/rel-build-cmake/bin\..\lib\clang\3.0/../../../include/c++/4.7.0/x86_64-w64-mingw32"
ignoring nonexistent directory "d:/clang/rel-build-cmake/bin\..\lib\clang\3.0/../../../include/c++/4.7.0/i686-w64-mingw32"
ignoring nonexistent directory "d:/clang/rel-build-cmake/bin\..\lib\clang\3.0/../../../include/c++/4.7.0/backward"
ignoring nonexistent directory "c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++"
ignoring nonexistent directory "c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++/mingw32"
ignoring nonexistent directory "c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++/backward"
ignoring nonexistent directory "c:/MinGW/lib/gcc/mingw32/4.4.0/include/c++"
ignoring nonexistent directory "c:/MinGW/lib/gcc/mingw32/4.4.0/include/c++/mingw32"
ignoring nonexistent directory "c:/MinGW/lib/gcc/mingw32/4.4.0/include/c++/backward"
ignoring nonexistent directory "c:/MinGW/lib/gcc/mingw32/4.3.0/include/c++"
ignoring nonexistent directory "c:/MinGW/lib/gcc/mingw32/4.3.0/include/c++/mingw32"
ignoring nonexistent directory "c:/MinGW/lib/gcc/mingw32/4.3.0/include/c++/backward"
ignoring nonexistent directory "/usr/local/include"
ignoring nonexistent directory "d:/clang/rel-build-cmake/bin/../lib/clang/3.0/../../../i686-w64-mingw32/include"
ignoring nonexistent directory "d:/clang/rel-build-cmake/bin/../lib/clang/3.0/../../../x86_64-w64-mingw32/include"
ignoring nonexistent directory "c:/mingw/include"
ignoring nonexistent directory "/usr/include"
#include "..." search starts here:
#include <...> search starts here:
 /mingw/lib/gcc/mingw32/4.5.2/include/c++
 /mingw/lib/gcc/mingw32/4.5.2/include/c++/mingw32
 /mingw/lib/gcc/mingw32/4.5.2/include/c++/backward
 d:/clang/rel-build-cmake/bin/../lib/clang/3.0/include
 d:/clang/rel-build-cmake/bin/../lib/clang/3.0/../../../include
 /mingw/include
End of search list.
unordered_map.cpp:8:25: error: call to deleted constructor of 'std::pair<const int, int>'
  Node(Args&&... args): value(std::forward<Args>(args)...) {}
                        ^     ~~~~~~~~~~~~~~~~~~~~~~~~
unordered_map.cpp:12:35: note: in instantiation of function template specialization 'Node<std::pair<const int, int> >::Node<const std::pair<const int, int> &>' requested here
  Node<std::pair<int const, int>> node(p);
                                  ^
/mingw/lib/gcc/mingw32/4.5.2/include/c++\bits/stl_pair.h:71:12: note: function has been explicitly marked deleted here
    struct pair
           ^
1 error generated.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: unordered_map.i
Type: application/octet-stream
Size: 38448 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20110917/98d06450/attachment.obj>


More information about the cfe-dev mailing list