template<int N> struct S { typedef int type; }; template<typename T> struct Get { static T get(); };
#ifdef BUG # define ELLIPSIS ... #else # define ELLIPSIS #endif template<typename F> struct B { template<typename ELLIPSIS Args> typename S<sizeof( Get<F>::get() (Get<Args>::get() ELLIPSIS) )>::type f(Args&& ELLIPSIS a); }; struct X { bool operator()(int) const; }; int main() { B<X> b; b.f(1); } jwak...@gcc16:~/src/tests$ g++ -std=c++0x -c pr.cc jwak...@gcc16:~/src/tests$ g++ -std=c++0x -c pr.cc -DBUG pr.cc: In instantiation of B<X>: pr.cc:35:10: instantiated from here pr.cc:25:9: internal compiler error: in tsubst, at cp/pt.c:9733 Please submit a full bug report, with preprocessed source if appropriate. See <http://gcc.gnu.org/bugs.html> for instructions. The code compiles fine with a single template parameter, but not with a parameter pack of size one. I'm trying to use SFINAE to disable overloads when a function call expression is invalid, which is needed to implement std::bind for C++0x -- Summary: ICE trying to use sfinae with variadic template pack expansion Product: gcc Version: 4.5.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: jwakely dot gcc at gmail dot com http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40595