// PR c++/56041 // { dg-do compile { target c++11 } } template< class T, T v > struct integral_constant { using type = integral_constant; using value_type = T; static constexpr T value = v; constexpr operator T ( ) noexcept { return value; } }; using true_type = integral_constant; using false_type = integral_constant; template< bool b, class T = void > struct enable_if { using type = T; }; template< class T > struct enable_if { }; template< class T, class = typename enable_if< true_type{} // should compile; doesn't , T>::type > T try_it( ) { return T{}; } int main( ) { static_assert( true_type{} , "failed test 1!" ); static_assert( true_type{} , "failed test 2!" ); static_assert( ! false_type{} , "failed test 3!" ); static_assert( !! true_type{} , "failed test 4!" ); return try_it(); }