Software Archive
Read-only legacy content
Announcements
FPGA community forums and blogs on community.intel.com are migrating to the new Altera Community and are read-only. For urgent support needs during this transition, please visit the FPGA Design Resources page or contact an Altera Authorized Distributor.
17060 Discussions

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

Aniket_P_1
Beginner
463 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
463 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