Boost logo

Boost Users :

Subject: [Boost-users] Intel 14.0.1 error with boost::bind
From: Aniket Pugaonkar (aniket.pugaonkar_at_[hidden])
Date: 2014-07-01 01:40:48


Hi,

I am using a test program for compiling a boost::bind in Intel MIC(Xeom
Phi). Here are the details of the code and platform on which it is
compiled. I am using thread building blocks in my code, but the following
code does not contain any TBB threads. The errors in my test code below and
original code are same.

Compiler : Intel 13.0.1 / intel 14.0.1 SP1 Update 3 (latest from intel
composer XE trial version) I am using our lab's compiler installed on a
cluster. The TBB is installed in my home directory. boost 1.55 is also
installed in my home location.

Compiled for MIC: icpc -mmic -L/home/aniketnp/tbb42_20140122oss/lib/mic
-std=c++11 -I/home/aniketnp/boost_1_55_0
-I/home/aniketnp/tbb42_20140122oss/include test.cpp

Scenario: a functor takes 2 arguments in its operator()() by using a
boost::bind() method. The operator()() method contains a function which
uses comparisons ( < or > ) using if-else logic. The error pops up here.
Here is the following code.

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

using namespace std;

struct Info_t {
 int start;
 int end;
 Info_t(int s=0,int e=0) : start(s), end(e) { }
};

template <typename T, typename time>
void process_info(const T& info1, const T& info2, const time& t) {

  //the below gives compiler error
 * if ((info1.start < info2.end) && (info2.end > info1.end) &&
(info1.end < info2.start) )*
   std::cout << "yess error with mic" << std::endl;

  //the below if works fine
  if ((info1.start < info2.end) && (info2.end > info1.end))
   std::cout << "no error at all" << std::endl;
}

template<typename Time>
struct my_functor {
 public:
  my_functor() { }
  my_functor(Time& time_) : time(time_) { }

 typedef void result_type;

 template<typename info_t>
 void operator()(const info_t& info1, const info_t& info2) {
   const auto& i1 = info1;
   const auto& i2 = info2;
   process_info<info_t, Time> (i1,i2, time);
 }

 private:
  Time& time;
};

int main() {
Info_t i1(10,2);
Info_t i2(2,10);
int t = 1;
auto func = boost::bind( my_functor<int>(t), _1, _2 );
func(i1,i2);
return 0;
}

test.cpp(16): error: expression must have a constant value
    if ((info1.start < info2.end) && (info2.end > info1.end) &&
(info1.end < info2.start) )
                                                                             ^
          detected during:
            instantiation of "void my_functor<Time>::operator()(const
info_t &, const info_t &) [with Time=int, info_t=Info_t]" at line 313
of "/home/aniketnp/boost_1_55_0/boost/bind/bind.hpp"
            instantiation of "void boost::_bi::list2<A1,
A2>::operator()(boost::_bi::type<void>, F &, A &, int) [with
A1=boost::arg<1>, A2=boost::arg<2>, F=my_functor<int>,
A=boost::_bi::list2<Info_t &, Info_t &>]" at line 61 of
"/home/aniketnp/boost_1_55_0/boost/bind/bind_template.hpp"
            instantiation of "boost::_bi::bind_t<R, F, L>::result_type
boost::_bi::bind_t<R, F, L>::operator()(A1 &, A2 &) [with
R=boost::_bi::unspecified, F=my_functor<int>,
L=boost::_bi::list2<boost::arg<1>, boost::arg<2>>, A1=Info_t,
A2=Info_t]" at line 48

test.cpp(16): error: this operator is not allowed in a template
argument expression
    if ((info1.start < info2.end) && (info2.end > info1.end) &&
(info1.end < info2.start) )

           ^
          detected during:
            instantiation of "void my_functor<Time>::operator()(const
info_t &, const info_t &) [with Time=int, info_t=Info_t]" at line 313
of "/home/aniketnp/boost_1_55_0/boost/bind/bind.hpp"
            instantiation of "void boost::_bi::list2<A1,
A2>::operator()(boost::_bi::type<void>, F &, A &, int) [with
A1=boost::arg<1>, A2=boost::arg<2>, F=my_functor<int>,
A=boost::_bi::list2<Info_t &, Info_t &>]" at line 61 of
"/home/aniketnp/boost_1_55_0/boost/bind/bind_template.hpp"
            instantiation of "boost::_bi::bind_t<R, F, L>::result_type
boost::_bi::bind_t<R, F, L>::operator()(A1 &, A2 &) [with
R=boost::_bi::unspecified, F=my_functor<int>,
L=boost::_bi::list2<boost::arg<1>, boost::arg<2>>, A1=Info_t,
A2=Info_t]" at line 48

test.cpp(16): error: expected a ">"
    if ((info1.start < info2.end) && (info2.end > info1.end) &&
(info1.end < info2.start) )

                 ^
          detected during:
            instantiation of "void my_functor<Time>::operator()(const
info_t &, const info_t &) [with Time=int, info_t=Info_t]" at line 313
of "/home/aniketnp/boost_1_55_0/boost/bind/bind.hpp"
            instantiation of "void boost::_bi::list2<A1,
A2>::operator()(boost::_bi::type<void>, F &, A &, int) [with
A1=boost::arg<1>, A2=boost::arg<2>, F=my_functor<int>,
A=boost::_bi::list2<Info_t &, Info_t &>]" at line 61 of
"/home/aniketnp/boost_1_55_0/boost/bind/bind_template.hpp"
            instantiation of "boost::_bi::bind_t<R, F, L>::result_type
boost::_bi::bind_t<R, F, L>::operator()(A1 &, A2 &) [with
R=boost::_bi::unspecified, F=my_functor<int>,
L=boost::_bi::list2<boost::arg<1>, boost::arg<2>>, A1=Info_t,
A2=Info_t]" at line 48

As a workaround, I try to do this, but same error

 if ((info2.start < info2.end) && (info2.end > info1.end) )
 {
     if ( info1.end < info2.start)
        //do something
  }

// error is propagated towards inner if loop

test.cpp(17): error: expression must have a constant value
       if ( info1.end < info2.start)
                        ^
          detected during:
            instantiation of "void my_functor<Time>::operator()(const
info_t &, const info_t &) [with Time=int, info_t=Info_t]" at line 313
of "/home/aniketnp/boost_1_55_0/boost/bind/bind.hpp"
            instantiation of "void boost::_bi::list2<A1,
A2>::operator()(boost::_bi::type<void>, F &, A &, int) [with
A1=boost::arg<1>, A2=boost::arg<2>, F=my_functor<int>,
A=boost::_bi::list2<Info_t &, Info_t &>]" at line 61 of
"/home/aniketnp/boost_1_55_0/boost/bind/bind_template.hpp"
            instantiation of "boost::_bi::bind_t<R, F, L>::result_type
boost::_bi::bind_t<R, F, L>::operator()(A1 &, A2 &) [with
R=boost::_bi::unspecified, F=my_functor<int>,
L=boost::_bi::list2<boost::arg<1>, boost::arg<2>>, A1=Info_t,
A2=Info_t]" at line 49

test.cpp(17): error: this operator is not allowed in a template
argument expression

 (rest error is the same)

-------------------------------------------------------------------------------------------------

Now, if I compile it without " -mmic " flag, then there is no compiler errors.

I compile with this : icpc
-L/home/aniketnp/tbb42_20140122oss/lib/intel64/gcc4.4 -std=c++11
-I/home/aniketnp/boost_1_55_0
-I/home/aniketnp/tbb42_20140122oss/include test.cpp

I dont get any error. It compiles and runs fine.

Any thoughts ? Please let me know.

-- 
Thanks and regards,
Aniket Pugaonkar


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net