Opened 8 years ago

Last modified 8 years ago

#10785 new Bugs

Lambda assignment fails to compile in 1.57.0

Reported by: dolfim@… Owned by: No-Maintainer
Milestone: To Be Determined Component: lambda
Version: Boost 1.57.0 Severity: Problem
Keywords: Cc:

Description

The following code used to work. From Boost 1.57.0 it does not compile with Clang 3.4, 3.5, 3.6 and Apple Clang.

#include <iostream>
#include <boost/function.hpp>
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>


int add(int a, int b) {
    return a+b;
}


int main() {
    
    boost::function<int (int, int)> fuse = boost::lambda::bind(&add, boost::lambda::_1, -boost::lambda::_2);
    
    int a = fuse(3,6);
    std::cout << a << std::endl;
}

The compiler error reads:

In file included from boost_lambda.cpp:3:
In file included from /Users/dolfim/src/boost_1_57_0/boost/lambda/lambda.hpp:14:
In file included from /Users/dolfim/src/boost_1_57_0/boost/lambda/core.hpp:46:
/Users/dolfim/src/boost_1_57_0/boost/lambda/detail/lambda_traits.hpp:256:58: error: cannot form a reference to 'void'
      typename detail::IF<boost::is_function<T>::value, T&, const T>::RET
                                                         ^
/Users/dolfim/src/boost_1_57_0/boost/lambda/detail/operators.hpp:148:98: note: in instantiation of template class
      'boost::lambda::const_copy_argument<const void>' requested here
BOOST_LAMBDA_BE2(BOOST_LAMBDA_COMMA_OPERATOR_NAME, other_action<comma_action>, const A, const B, const_copy_argument)
                                                                                                 ^
/Users/dolfim/src/boost_1_57_0/boost/lambda/detail/operators.hpp:63:20: note: expanded from macro 'BOOST_LAMBDA_BE2'
    tuple<typename CONVERSION <CONSTA>::type, lambda_functor<Arg> >        \
                   ^
/Users/dolfim/src/boost_1_57_0/boost/lambda/detail/operators.hpp:148:18: note: while substituting deduced template arguments into
      function template 'operator,' [with A = void, Arg = boost::lambda::lambda_functor_base<boost::lambda::action<3,
      boost::lambda::function_action<3, boost::lambda::detail::unspecified> >, boost::tuples::tuple<int (*const)(int, int), const
      boost::lambda::lambda_functor<boost::lambda::placeholder<FIRST> >, const
      boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::unary_arithmetic_action<boost::lambda::minus_action>,
      boost::tuples::tuple<boost::lambda::lambda_functor<boost::lambda::placeholder<SECOND> >, boost::tuples::null_type,
      boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type,
      boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> > >,
      boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type,
      boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> >]
BOOST_LAMBDA_BE2(BOOST_LAMBDA_COMMA_OPERATOR_NAME, other_action<comma_action>, const A, const B, const_copy_argument)
                 ^
/Users/dolfim/src/boost_1_57_0/boost/lambda/detail/operators.hpp:145:42: note: expanded from macro
      'BOOST_LAMBDA_COMMA_OPERATOR_NAME'
#define BOOST_LAMBDA_COMMA_OPERATOR_NAME operator,
                                         ^
/Users/dolfim/src/boost_1_57_0/boost/lambda/detail/operators.hpp:65:78: note: expanded from macro 'BOOST_LAMBDA_BE2'
>                                                                            \
                                                                             ^
/Users/dolfim/src/boost_1_57_0/boost/type_traits/is_copy_constructible.hpp:104:24: note: in instantiation of template class
      'boost::detail::is_copy_constructible_impl2<false,
      boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<3, boost::lambda::function_action<3,
      boost::lambda::detail::unspecified> >, boost::tuples::tuple<int (*const)(int, int), const
      boost::lambda::lambda_functor<boost::lambda::placeholder<FIRST> >, const
      boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::unary_arithmetic_action<boost::lambda::minus_action>,
      boost::tuples::tuple<boost::lambda::lambda_functor<boost::lambda::placeholder<SECOND> >, boost::tuples::null_type,
      boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type,
      boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> > >,
      boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type,
      boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> > > >' requested here
        boost::detail::is_copy_constructible_impl2<
                       ^
/Users/dolfim/src/boost_1_57_0/boost/config/suffix.hpp:394:72: note: expanded from macro 'BOOST_STATIC_CONSTANT'
#     define BOOST_STATIC_CONSTANT(type, assignment) static const type assignment
                                                                       ^
/Users/dolfim/src/boost_1_57_0/boost/type_traits/is_copy_constructible.hpp:113:71: note: in instantiation of template class
      'boost::detail::is_copy_constructible_impl<boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<3,
      boost::lambda::function_action<3, boost::lambda::detail::unspecified> >, boost::tuples::tuple<int (*const)(int, int), const
      boost::lambda::lambda_functor<boost::lambda::placeholder<FIRST> >, const
      boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::unary_arithmetic_action<boost::lambda::minus_action>,
      boost::tuples::tuple<boost::lambda::lambda_functor<boost::lambda::placeholder<SECOND> >, boost::tuples::null_type,
      boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type,
      boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> > >,
      boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type,
      boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> > > >' requested here
BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_copy_constructible,T,::boost::detail::is_copy_constructible_impl<T>::value)
                                                                      ^
/Users/dolfim/src/boost_1_57_0/boost/type_traits/detail/bool_trait_def.hpp:61:30: note: expanded from macro
      'BOOST_TT_AUX_BOOL_TRAIT_DEF1'
    BOOST_TT_AUX_BOOL_C_BASE(C) \
                             ^
/Users/dolfim/src/boost_1_57_0/boost/type_traits/detail/bool_trait_def.hpp:55:81: note: expanded from macro
      'BOOST_TT_AUX_BOOL_C_BASE'
#   define BOOST_TT_AUX_BOOL_C_BASE(C) : public ::boost::integral_constant<bool,C>
                                                                                ^
/Users/dolfim/src/boost_1_57_0/boost/type_traits/has_trivial_copy.hpp:36:76: note: in instantiation of template class
      'boost::is_copy_constructible<boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<3,
      boost::lambda::function_action<3, boost::lambda::detail::unspecified> >, boost::tuples::tuple<int (*const)(int, int), const
      boost::lambda::lambda_functor<boost::lambda::placeholder<FIRST> >, const
      boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::unary_arithmetic_action<boost::lambda::minus_action>,
      boost::tuples::tuple<boost::lambda::lambda_functor<boost::lambda::placeholder<SECOND> >, boost::tuples::null_type,
      boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type,
      boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> > >,
      boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type,
      boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> > > >' requested here
   BOOST_STATIC_CONSTANT(bool, value = BOOST_HAS_TRIVIAL_COPY(T) && boost::is_copy_constructible<T>::value);
                                                                           ^
/Users/dolfim/src/boost_1_57_0/boost/config/suffix.hpp:394:72: note: expanded from macro 'BOOST_STATIC_CONSTANT'
#     define BOOST_STATIC_CONSTANT(type, assignment) static const type assignment
                                                                       ^
/Users/dolfim/src/boost_1_57_0/boost/type_traits/has_trivial_copy.hpp:62:78: note: in instantiation of template class
      'boost::detail::has_trivial_copy_impl<boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<3,
      boost::lambda::function_action<3, boost::lambda::detail::unspecified> >, boost::tuples::tuple<int (*const)(int, int), const
      boost::lambda::lambda_functor<boost::lambda::placeholder<FIRST> >, const
      boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::unary_arithmetic_action<boost::lambda::minus_action>,
      boost::tuples::tuple<boost::lambda::lambda_functor<boost::lambda::placeholder<SECOND> >, boost::tuples::null_type,
      boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type,
      boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> > >,
      boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type,
      boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> > > >' requested here
BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_trivial_copy_constructor,T,::boost::detail::has_trivial_copy_impl<T>::value)
                                                                             ^
/Users/dolfim/src/boost_1_57_0/boost/type_traits/detail/bool_trait_def.hpp:61:30: note: expanded from macro
      'BOOST_TT_AUX_BOOL_TRAIT_DEF1'
    BOOST_TT_AUX_BOOL_C_BASE(C) \
                             ^
/Users/dolfim/src/boost_1_57_0/boost/type_traits/detail/bool_trait_def.hpp:55:81: note: expanded from macro
      'BOOST_TT_AUX_BOOL_C_BASE'
#   define BOOST_TT_AUX_BOOL_C_BASE(C) : public ::boost::integral_constant<bool,C>
                                                                                ^
/Users/dolfim/src/boost_1_57_0/boost/function/function_template.hpp:939:20: note: in instantiation of template class
      'boost::has_trivial_copy_constructor<boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<3,
      boost::lambda::function_action<3, boost::lambda::detail::unspecified> >, boost::tuples::tuple<int (*const)(int, int), const
      boost::lambda::lambda_functor<boost::lambda::placeholder<FIRST> >, const
      boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::unary_arithmetic_action<boost::lambda::minus_action>,
      boost::tuples::tuple<boost::lambda::lambda_functor<boost::lambda::placeholder<SECOND> >, boost::tuples::null_type,
      boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type,
      boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> > >,
      boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type,
      boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> > > >' requested here
        if (boost::has_trivial_copy_constructor<Functor>::value &&
                   ^
/Users/dolfim/src/boost_1_57_0/boost/function/function_template.hpp:722:13: note: in instantiation of function template
      specialization 'boost::function2<int, int,
      int>::assign_to<boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<3,
      boost::lambda::function_action<3, boost::lambda::detail::unspecified> >, boost::tuples::tuple<int (*const)(int, int), const
      boost::lambda::lambda_functor<boost::lambda::placeholder<FIRST> >, const
      boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::unary_arithmetic_action<boost::lambda::minus_action>,
      boost::tuples::tuple<boost::lambda::lambda_functor<boost::lambda::placeholder<SECOND> >, boost::tuples::null_type,
      boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type,
      boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> > >,
      boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type,
      boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> > > >' requested here
      this->assign_to(f);
            ^
/Users/dolfim/src/boost_1_57_0/boost/function/function_template.hpp:1071:5: note: in instantiation of function template
      specialization 'boost::function2<int, int,
      int>::function2<boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<3,
      boost::lambda::function_action<3, boost::lambda::detail::unspecified> >, boost::tuples::tuple<int (*const)(int, int), const
      boost::lambda::lambda_functor<boost::lambda::placeholder<FIRST> >, const
      boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::unary_arithmetic_action<boost::lambda::minus_action>,
      boost::tuples::tuple<boost::lambda::lambda_functor<boost::lambda::placeholder<SECOND> >, boost::tuples::null_type,
      boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type,
      boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> > >,
      boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type,
      boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> > > >' requested here
    base_type(f)
    ^
boost_lambda.cpp:14:44: note: in instantiation of function template specialization 'boost::function<int (int,
      int)>::function<boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<3,
      boost::lambda::function_action<3, boost::lambda::detail::unspecified> >, boost::tuples::tuple<int (*const)(int, int), const
      boost::lambda::lambda_functor<boost::lambda::placeholder<FIRST> >, const
      boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::unary_arithmetic_action<boost::lambda::minus_action>,
      boost::tuples::tuple<boost::lambda::lambda_functor<boost::lambda::placeholder<SECOND> >, boost::tuples::null_type,
      boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type,
      boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> > >,
      boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type,
      boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> > > >' requested here
    boost::function<int (int, int)> fuse = boost::lambda::bind(&add, boost::lambda::_1, -boost::lambda::_2);
                                           ^
1 error generated.

Change History (2)

comment:1 by Marshall Clow, 8 years ago

More info: this compiles fine for me on clang with -std=c++11 or -std=c++14, but fails with -std=c++03

This is the part that causes the problem:

    boost::function<int (int, int)> fuse = 
		boost::lambda::bind(&add, boost::lambda::_1, -boost::lambda::_2);

and commenting out the first line removes the error.

comment:2 by Jack Howarth <howarth.at.mailing.lists@…>, 8 years ago

This issue also exists in the boost 1.58 release.

Note: See TracTickets for help on using tickets.