Community
cancel
Showing results for 
Search instead for 
Did you mean: 
rnickb
Beginner
60 Views

sfinae bug with intel c++ compiler 15

Following code (also attached)  compiles fine with clang gcc but fails with an error with icc.

 

#include <iostream>                                                                                 

                                                                                                    

struct MyIndex : std::integral_constant<int, -1> {};                                                

                                                                                                    

struct Dimension {                                                                                  

  using Dynamic = MyIndex;                                                                          

};                                                                                                  

                                                                                                    

template<class T, T Key>                                                                            

constexpr bool make_true2(const std::integral_constant<T, Key>&)                                    

{                                                                                                   

  return 1;                                                                                         

}                                                                                                   

                                                                                                    

template<int I>                                                                                     

constexpr int make_true() {                                                                         

  return make_true2(Dimension::Dynamic());                                                          

}                                                                                                   

                                                                                                    

template<                                                                                           

    int I                                                                                           

  , typename std::enable_if<make_true<I>(), int>::type = 0                                          

>                                                                                                   

int myfunc() {                                                                                      

  return 9;                                                                                         

}                                                                                                   

                                                                                                    

int main() {                                                                                        

  std::cout << myfunc<0>() << std::endl;                                                            

  return 0;                                                                                         

}                                                                                                 

0 Kudos
4 Replies
60 Views

Hi rnickb,

I've reproduced the issue and submitted to dev team to fix. Thank you very much.

Thanks,

Shenghong

Walter_D_
Beginner
60 Views

Any progress on this one? I have a similar issue (icc 15.0.0.090) aborts compilation claiming error, or (if changed the code somewhat) crashes with ICE (c++/4.8.1/type_traits(1766): interal error: assertion failed: lower_constant: bad kind (shared/cfe/edgcpfe/lower_il.c, line 5804).

Walter.

MalReddy_Y_Intel
Employee
60 Views

Dev team has proposed below workaround:

Change the code as shown below:

template<
    int I
#ifdef OK
  , typename std::enable_if<make_true2(Dimension::Dynamic()), int>::type = 0
#else
  , typename std::enable_if<make_true<I>(), int>::type = 0
#endif
 

Thanks,

Reddy

 

60 Views

@Walter D.

If possible, you may provide your test case, so that we can check whether they are same root cause.

For the issue reported in this thread, it is fixed in mainline.

Thanks,

Shenghong

Reply