DESCRIPTION The following code compiles on Intel without issue with gcc-4.1.3 and gcc-4.2, but fails at LINE=29 on cross-compile with ppc_85xx-gcc-4.0:
$ cat -n Foo.cc 1 2 #include <tr1/tuple> 3 #include <tr1/unordered_map> 4 #include <vector> 5 #include <string> 6 7 typedef std::vector<int> IntVector; 8 typedef std::tr1::unordered_map<std::string, IntVector, std::tr1::hash<std::string> > VectorMap; 9 10 class Foo 11 { 12 public: 13 Foo(VectorMap& map) : map_(map) {} 14 void insert(std::string s, int value); 15 16 private: 17 VectorMap& map_; 18 }; 19 20 void Foo::insert(std::string s, int value) 21 { 22 bool vector_exists = true; 23 24 VectorMap::iterator i = map_.find(s); 25 if (i == map_.end()) 26 { 27 IntVector v; 28 std::pair<std::string, IntVector> p(s, v); 29 std::tr1::tie(i, vector_exists) = map_.insert(p); 30 } 31 32 if (!vector_exists) 33 { 34 return; 35 } 36 37 (*i).second.push_back(value); 38 } 39 $ ppc_85xx-g++ -v -save-temps -c Foo.cc Using built-in specs. Target: powerpc-linux Configured with: /opt/eldk/build/ppc-2006-01-11/work/usr/src/denx/BUILD/crosstool-0.35/build/gcc-4.0.0-glibc-2.3.5-eldk/powerpc-linux/gcc-4.0.0/configure --target=powerpc-linux --host=i686-host_pc-linux-gnu --prefix=/var/tmp/eldk.BjN6Wo/usr/crosstool/gcc-4.0.0-glibc-2.3.5-eldk/powerpc-linux --with-headers=/var/tmp/eldk.BjN6Wo/usr/crosstool/gcc-4.0.0-glibc-2.3.5-eldk/powerpc-linux/powerpc-linux/include --with-local-prefix=/var/tmp/eldk.BjN6Wo/usr/crosstool/gcc-4.0.0-glibc-2.3.5-eldk/powerpc-linux/powerpc-linux --disable-nls --enable-threads=posix --enable-symvers=gnu --enable-__cxa_atexit --enable-languages=c,c++ --enable-shared --enable-c99 --enable-long-long Thread model: posix gcc version 4.0.0 (DENX ELDK 4.0 4.0.0) /opt/exported/ppc/eldk/toolchain/release-4.0/usr/bin/../libexec/gcc/powerpc-linux/4.0.0/cc1plus -E -quiet -v -iprefix /opt/exported/ppc/eldk/toolchain/release-4.0/usr/bin/../lib/gcc/powerpc-linux/4.0.0/ -D_GNU_SOURCE -D__unix__ -D__gnu_linux__ -D__linux__ -Dunix -D__unix -Dlinux -D__linux -Asystem=linux -Asystem=unix -Asystem=posix Foo.cc -mcpu=8540 -mfloat-gprs=yes -mspe=yes -mabi=spe -fpch-preprocess -o Foo.ii ignoring nonexistent directory "/opt/exported/ppc/eldk/toolchain/release-4.0/usr/lib/gcc/powerpc-linux/4.0.0/../../../../include/c++/4.0.0" ignoring nonexistent directory "/opt/exported/ppc/eldk/toolchain/release-4.0/usr/lib/gcc/powerpc-linux/4.0.0/../../../../include/c++/4.0.0/backward" ignoring nonexistent directory "/opt/exported/ppc/eldk/toolchain/release-4.0/usr/lib/gcc/powerpc-linux/4.0.0/../../../../powerpc-linux/sys-include" ignoring nonexistent directory "/opt/exported/ppc/eldk/toolchain/release-4.0/usr/lib/gcc/powerpc-linux/4.0.0/../../../../powerpc-linux/include" #include "..." search starts here: #include <...> search starts here: /opt/exported/ppc/eldk/toolchain/release-4.0/usr/lib/gcc/powerpc-linux/4.0.0/include /opt/exported/ppc/eldk/toolchain/release-4.0/ppc_85xx/usr/include/c++/4.0.0 /opt/exported/ppc/eldk/toolchain/release-4.0/ppc_85xx/usr/include/c++/4.0.0/powerpc-linux /opt/exported/ppc/eldk/toolchain/release-4.0/ppc_85xx/usr/include/c++/4.0.0/backward /opt/exported/ppc/eldk/toolchain/release-4.0/usr/../ppc_85xx/usr/include End of search list. /opt/exported/ppc/eldk/toolchain/release-4.0/usr/bin/../libexec/gcc/powerpc-linux/4.0.0/cc1plus -fpreprocessed Foo.ii -quiet -dumpbase Foo.cc -mcpu=8540 -mfloat-gprs=yes -mspe=yes -mabi=spe -auxbase Foo -version -o Foo.s GNU C++ version 4.0.0 (DENX ELDK 4.0 4.0.0) (powerpc-linux) compiled by GNU C version 2.96 20000731 (Red Hat Linux 7.3 2.96-113). GGC heuristics: --param ggc-min-expand=81 --param ggc-min-heapsize=96936 /opt/exported/ppc/eldk/toolchain/release-4.0/ppc_85xx/usr/include/c++/4.0.0/tr1/tuple_iterate.h: In constructor 'std::tr1::tuple<_T1, _T2, std::tr1::_NullClass, std::tr1::_NullClass, std::tr1::_NullClass, std::tr1::_NullClass, std::tr1::_NullClass, std::tr1::_NullClass, std::tr1::_NullClass, std::tr1::_NullClass>::tuple(const std::pair<_U1, _U2>&) [with _U1 = Internal::hashtable_iterator<std::pair<const std::string, IntVector>, false, false>, _U2 = bool, _T1 = Internal::hashtable_iterator<std::pair<const std::string, IntVector>, false, false>&, _T2 = bool&]': Foo.cc:29: instantiated from here /opt/exported/ppc/eldk/toolchain/release-4.0/ppc_85xx/usr/include/c++/4.0.0/tr1/tuple_iterate.h:58: error: invalid initialization of reference of type 'Internal::hashtable_iterator<std::pair<const std::string, IntVector>, false, false>&' from expression of type 'const Internal::hashtable_iterator<std::pair<const std::string, IntVector>, false, false>' /opt/exported/ppc/eldk/toolchain/release-4.0/ppc_85xx/usr/include/c++/4.0.0/tr1/tuple_iterate.h:58: error: invalid initialization of reference of type 'bool&' from expression of type 'const bool' #------------------------------------------------------------------------------- WORKAROUND Replace LINE=29 with lines 30..33 inclusive as shown below. $ cat -n Foo2.cc 1 2 #include <tr1/tuple> 3 #include <tr1/unordered_map> 4 #include <vector> 5 #include <string> 6 7 typedef std::vector<int> IntVector; 8 typedef std::tr1::unordered_map<std::string, IntVector, std::tr1::hash<std::string> > VectorMap; 9 10 class Foo2 11 { 12 public: 13 Foo2(VectorMap& map) : map_(map) {} 14 void insert(std::string s, int value); 15 16 private: 17 VectorMap& map_; 18 }; 19 20 void Foo2::insert(std::string s, int value) 21 { 22 bool vector_exists = true; 23 24 VectorMap::iterator i = map_.find(s); 25 if (i == map_.end()) 26 { 27 IntVector v; 28 std::pair<std::string, IntVector> p(s, v); 29 // std::tr1::tie(i, vector_exists) = map_.insert(p); // broken 30 std::pair<VectorMap::iterator, bool> result(map_.end(), false); 31 result = map_.insert(p); 32 i = result.first; 33 vector_exists = result.second; 34 } 35 36 if (!vector_exists) 37 { 38 return; 39 } 40 41 (*i).second.push_back(value); 42 } 43 -- Summary: Cannot use std::tr1::tie() with unordered_map<> of std::vector<> Product: gcc Version: 4.0.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: dfeathers at omnitrol dot com GCC build triplet: i686-host_pc-linux-gnu GCC host triplet: i686-host_pc-linux-gnu GCC target triplet: powerpc-unknown-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36567