Boost logo

Boost :

Subject: [boost] [multi_index][intel-linux-14.0.0] Help needed debugging initializer list support
From: Joaquin M Lopez Munoz (joaquin_at_[hidden])
Date: 2013-09-19 16:49:38


Hi,

The trunk version of Boost.MultiIndex introduces support for
initializer list, which seems to work fine with regression tests
except for intel-linux-14.0.0:

http://tinyurl.com/pclssoe
http://tinyurl.com/nzwzpu6

which spits error messages like this (replaced large chunks of text
with *** for clarity):

../libs/multi_index/test/test_modifiers.cpp(230): error: no instance of
overloaded function
          "boost::multi_index::detail::hashed_index<***>::insert [***]"
matches the
          argument list
            argument types are: ({...})
            object type is: employee_set_by_name
    i1.insert({{4,"Vanessa",20,9236},{5,"Penelope",55,2358}});

At first I thought this is failing because for it to work the compiler
should not only support initializer lists but also C++11 unified
initialization syntax, but I think this is not the problem because

a) intel-linux-14.0.0 does indeed seem to support unified initialization
syntax, since BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX is not
listed in http://tinyurl.com/ndutn2w .
b) the following test code also fails:

  s.assign({0,1,2,3,4,5});

with s a multi_index_container of ints, and this does not depend
on unified initialization syntaxes. The error message here, FWIW, is
different than before:

../libs/multi_index/test/test_copy_assignment.cpp(56): internal error:
assertion failed: node_has_side_effects: bad node kind
(shared/cfe/edgcpfe/il.c, line 20611)

The tested code seems simple enough, for instance lines 271 and
following of multi_index_container.hpp look like:

  #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
    multi_index_container(
      std::initializer_list<Value> list,
      const ctor_args_list& args_list=ctor_args_list(),
      const allocator_type& al=allocator_type())
  [...]

and the ofending assign member function in sequenced_index.hpp
is as innocent as:

  #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
    void assign(std::initializer_list<value_type> list)
    {
      assign(list.begin(),list.end());
    }
  #endif

Besides, other libs with initializer list support such as Boost.SmartPtr
and Boost.Unordered cope fine with this compiler.

Clues? Any help much appreciated.

Joaquín M López Muñoz
Telefónica Digital


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk