Software Archive
Read-only legacy content
17061 Discussions

Possible compiler bug in compiling code for MIC (XE SP1 Update3)

Aniket_P_1
Beginner
350 Views

Hi, 

I had logged a similar query here     https://software.intel.com/en-us/forums/topic/517612

With reference to the code below, it looks like a possible compiler bug in compile code for intel MIC architecture. 

with intel composer xe 2013 sp1 update 3 (trial) 

Compile command : icpc -mmic -std=c++11  -I/home/aniketnp/boost_with intel composer xe 2013 sp1 update 3 (trial) 1_55_0 test.cpp

 

#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 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 {
   if ((info2.start < info2.end) && (info2.end > info1.end) ) {
      if ( info1.end < info2.start)   //NOTE THIS LINE " < " 
       std::cout << " hi " << std::endl;
   }
 }

 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 );
auto func = std::bind( my_functor<int>(t), std::placeholders::_1, std::placeholders::_2 );
func(i1,i2);
return 0;
}

Gives the error as 

 

test.cpp(24): error: expression must have a constant value
        if ( info1.end < info2.start)
                         ^
          detected during:
            instantiation of "_Result std::_Bind<_Functor (_Bound_args...)>::__call<_Result,_Args...,_Indexes...>(std::tuple<_Args...> &&, std::_Index_tuple<_Indexes...>) [with _Functor=my_functor<int>, _Bound_args=<std::_Placeholder<1>, std::_Placeholder<2>>, _Result=void, _Args=<Info_t &, Info_t &>, _Indexes=<0, 1>]" at line 1205 of "/usr/linux-k1om-4.7/linux-k1om/../x86_64-k1om-linux/include/c++/4.7.0/functional"
            instantiation of "_Result std::_Bind<_Functor (_Bound_args...)>::operator()(_Args &&...) [with _Functor=my_functor<int>, _Bound_args=<std::_Placeholder<1>, std::_Placeholder<2>>, _Args=<Info_t &, Info_t &>, _Result=void]" at line 39

test.cpp(24): error: this operator is not allowed in a template argument expression
        if ( info1.end < info2.start)
                              ^
          detected during:
            instantiation of "_Result std::_Bind<_Functor (_Bound_args...)>::__call<_Result,_Args...,_Indexes...>(std::tuple<_Args...> &&, std::_Index_tuple<_Indexes...>) [with _Functor=my_functor<int>, _Bound_args=<std::_Placeholder<1>, std::_Placeholder<2>>, _Result=void, _Args=<Info_t &, Info_t &>, _Indexes=<0, 1>]" at line 1205 of "/usr/linux-k1om-4.7/linux-k1om/../x86_64-k1om-linux/include/c++/4.7.0/functional"
            instantiation of "_Result std::_Bind<_Functor (_Bound_args...)>::operator()(_Args &&...) [with _Functor=my_functor<int>, _Bound_args=<std::_Placeholder<1>, std::_Placeholder<2>>, _Args=<Info_t &, Info_t &>, _Result=void]" at line 39

test.cpp(24): error: expected a ">"
        if ( info1.end < info2.start)
                                    ^
          detected during:
            instantiation of "_Result std::_Bind<_Functor (_Bound_args...)>::__call<_Result,_Args...,_Indexes...>(std::tuple<_Args...> &&, std::_Index_tuple<_Indexes...>) [with _Functor=my_functor<int>, _Bound_args=<std::_Placeholder<1>, std::_Placeholder<2>>, _Result=void, _Args=<Info_t &, Info_t &>, _Indexes=<0, 1>]" at line 1205 of "/usr/linux-k1om-4.7/linux-k1om/../x86_64-k1om-linux/include/c++/4.7.0/functional"
            instantiation of "_Result std::_Bind<_Functor (_Bound_args...)>::operator()(_Args &&...) [with _Functor=my_functor<int>, _Bound_args=<std::_Placeholder<1>, std::_Placeholder<2>>, _Args=<Info_t &, Info_t &>, _Result=void]" at line 39

compilation aborted for test.cpp (code 2)

 

 

POSSIBLE REASON: 

Compiler interprets this as a member template, because of which it gives expected " >  " 

 

Now if I change the code to this : 

if ( info1.end > info2.start)    // NOTE THE " > " SIGN

 

There is no error in compiling. IT works fine. 

 

Is this a possible bug for compiling with -mmic flag ? If I compile without  -mmic   flag, the compilation does not give any error. 

Kindly confirm. Thanks. 

 

 

 

 

0 Kudos
1 Reply
Kevin_D_Intel
Employee
350 Views

Thank you for the additional details. This is a variant of the error reported earlier with the 13.0 compiler here (https://software.intel.com/en-us/forums/topic/517612) so I will post any further information from Development in the earlier cited posting.

0 Kudos
Reply