https://llvm.org/bugs/show_bug.cgi?id=28386
Bug ID: 28386 Summary: Zero-sized array not Sfinae-failure in non-type template parameter Product: clang Version: trunk Hardware: PC OS: Linux Status: NEW Severity: normal Priority: P Component: C++11 Assignee: unassignedclangb...@nondot.org Reporter: lf...@thax.hardliners.org CC: dgre...@apple.com, llvm-bugs@lists.llvm.org Classification: Unclassified #include <type_traits> template <unsigned int... Is> struct index_sequence {}; template <bool B> using Sfinae=char (*)[B]; // does not work with msvc+clang; works with g++ //template <bool B> using Sfinae=char (*)[2*B-1]; // works with g++ and clang;(msvc does strange things) //template <bool B> using Sfinae=typename std::enable_if<B,int>::type; // works. template <unsigned int N,unsigned int... Is,typename =Sfinae<N==0>> constexpr index_sequence<Is...> make_index_sequence(...) { return {}; } template <unsigned int N,unsigned int... Is,typename =Sfinae<(N>0)>> constexpr auto make_index_sequence(...) -> decltype(make_index_sequence<N-1,N-1,Is...>(index_sequence<>())) // argument forces ADL { return {}; } int main() { index_sequence<0,1> t=make_index_sequence<2>(); } ---- clang++ will happily go from I=0 to I=4294967295 ... until it hits the template instantiation limit. According to my and g++'s understanding, using the first version should work, as zero-size array should lead to an SFINAE failure, just like negative sized arrays do. Using the Sfinae-type as function argument instead of as template parameter, all three versions compile fine, i.e. the zero sized array is treated as SFINAE failure, e.g.: template <unsigned int N,unsigned int... Is> constexpr index_sequence<Is...> make_index_sequence(index_sequence<> x={},Sfinae<N==0> =0) ... template <unsigned int N,unsigned int... Is> constexpr auto make_index_sequence(index_sequence<> x={},Sfinae<(N>0)> =0) ... (MSVC's problem with the second version has been reported here: https://connect.microsoft.com/VisualStudio/feedback/details/2881697 ) -- You are receiving this mail because: You are on the CC list for the bug.
_______________________________________________ llvm-bugs mailing list llvm-bugs@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs