This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug c++/36567] New: Cannot use std::tr1::tie() with unordered_map<> of std::vector<>


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]