Boost C++ Libraries: Ticket #13012: boost::has_equal_to fails with captureless lambda expression types https://svn.boost.org/trac10/ticket/13012 <p> The following </p> <pre class="wiki">include &lt;boost/type_traits/has_equal_to.hpp&gt; int main() { auto f=[](){}; (void)boost::has_equal_to&lt;decltype(f)&gt;::value; } </pre><p> generates a compile time error about an ambiguity for <code>operator==</code>, see <a class="ext-link" href="http://coliru.stacked-crooked.com/a/f1010ec991d2721a"><span class="icon">​</span>http://coliru.stacked-crooked.com/a/f1010ec991d2721a</a>. The problem has been tested to show in GCC and VS2015. For what it's worth, capturing lambda expressions do not trigger the problem. </p> en-us Boost C++ Libraries /htdocs/site/boost.png https://svn.boost.org/trac10/ticket/13012 Trac 1.4.3 John Maddock Sat, 10 Feb 2018 11:56:16 GMT status changed; resolution set https://svn.boost.org/trac10/ticket/13012#comment:1 https://svn.boost.org/trac10/ticket/13012#comment:1 <ul> <li><strong>status</strong> <span class="trac-field-old">new</span> → <span class="trac-field-new">closed</span> </li> <li><strong>resolution</strong> → <span class="trac-field-new">fixed</span> </li> </ul> <p> This is a somewhat documented issue, the example in the docs is: </p> <pre class="wiki">struct A { }; void operator==(const A&amp;, const A&amp;); struct B { operator A(); }; boost::has_equal_to&lt;A&gt;::value; // this is fine boost::has_equal_to&lt;B&gt;::value; // error: ambiguous overload </pre><p> A similar situation occurs with a captureless lambda, because <code>f</code> in your example above is really a class that looks like: </p> <pre class="wiki">struct some_obscure_name { operator void (*)()()const; }; </pre><p> However, it turns out that in C++11 we can do better, for modern compilers this is fixed in the sequence of commits in: <a class="ext-link" href="https://github.com/boostorg/type_traits/pull/64"><span class="icon">​</span>https://github.com/boostorg/type_traits/pull/64</a> </p> <p> Note that I still have to update the docs. </p> <p> Also note that whether a lambda is comparable to other lambdas is compiler specific: it is for gcc (via unambiguous conversion to function pointer), but not for msvc which has implicit conversions to 2 different function pointer types and is therefore ambiguous. So the new code reports <code>true</code> for gcc and <code>false</code> for msvc. </p> Ticket Joaquín M López Muñoz Mon, 12 Feb 2018 09:09:13 GMT <link>https://svn.boost.org/trac10/ticket/13012#comment:2 </link> <guid isPermaLink="false">https://svn.boost.org/trac10/ticket/13012#comment:2</guid> <description> <p> Hi John, thanks for fixing this. </p> <p> Unfortunately, in my use case I'm supporting GCC 4.8, which your fix is not. You might want to consider how I'm handling stateless lambdas in non-expression SFINAE scenarios via <code>boost::poly_collection::detail::is_likely_stateless_lambda</code> at: </p> <p> <a class="ext-link" href="https://github.com/boostorg/poly_collection/blob/develop/include/boost/poly_collection/detail/is_equality_comparable.hpp"><span class="icon">​</span>https://github.com/boostorg/poly_collection/blob/develop/include/boost/poly_collection/detail/is_equality_comparable.hpp</a> </p> <p> Best, </p> </description> <category>Ticket</category> </item> <item> <dc:creator>John Maddock</dc:creator> <pubDate>Mon, 12 Feb 2018 18:33:27 GMT</pubDate> <title/> <link>https://svn.boost.org/trac10/ticket/13012#comment:3 </link> <guid isPermaLink="false">https://svn.boost.org/trac10/ticket/13012#comment:3</guid> <description> <p> I confess I'm not that keen on jumping through hoops for gcc-4.8, however this patch: <a class="ext-link" href="https://github.com/boostorg/type_traits/commit/28658d6c11228ead4f284f9aaaf0b129a64a3e35"><span class="icon">​</span>https://github.com/boostorg/type_traits/commit/28658d6c11228ead4f284f9aaaf0b129a64a3e35</a> half-fixes the issue - the code will compile, but will return false for all lambdas. </p> </description> <category>Ticket</category> </item> <item> <dc:creator>Joaquín M López Muñoz</dc:creator> <pubDate>Mon, 12 Feb 2018 18:42:27 GMT</pubDate> <title/> <link>https://svn.boost.org/trac10/ticket/13012#comment:4 </link> <guid isPermaLink="false">https://svn.boost.org/trac10/ticket/13012#comment:4</guid> <description> <p> Does this work if the signature of the stateless lambda expression is not <code>void()</code>? </p> </description> <category>Ticket</category> </item> <item> <dc:creator>John Maddock</dc:creator> <pubDate>Mon, 12 Feb 2018 20:10:41 GMT</pubDate> <title/> <link>https://svn.boost.org/trac10/ticket/13012#comment:5 </link> <guid isPermaLink="false">https://svn.boost.org/trac10/ticket/13012#comment:5</guid> <description> <p> No, but I think that signature is mandated by the standard? Or are lambdas with function arguments also convertible to function pointers? </p> </description> <category>Ticket</category> </item> <item> <dc:creator>Joaquín M López Muñoz</dc:creator> <pubDate>Mon, 12 Feb 2018 20:57:11 GMT</pubDate> <title/> <link>https://svn.boost.org/trac10/ticket/13012#comment:6 </link> <guid isPermaLink="false">https://svn.boost.org/trac10/ticket/13012#comment:6</guid> <description> <p> I'm afraid stateless lambda expressions of any signature convert to the corresponding function pointer. </p> </description> <category>Ticket</category> </item> <item> <dc:creator>John Maddock</dc:creator> <pubDate>Sat, 17 Feb 2018 17:47:49 GMT</pubDate> <title/> <link>https://svn.boost.org/trac10/ticket/13012#comment:7 </link> <guid isPermaLink="false">https://svn.boost.org/trac10/ticket/13012#comment:7</guid> <description> <p> Nod. I realised that right after I went to bed! </p> <p> I've pulled your is_likely_stateless_lambda into type traits as a workaround for this case - and it sort of mostly works for gcc-4.7 and 4.8. However, gcc-4.6 and earlier does not handle the code, neither do any of the msvc versions effected (12 and earlier). So it's not much of fix to be honest. </p> </description> <category>Ticket</category> </item> <item> <dc:creator>anonymous</dc:creator> <pubDate>Mon, 19 Feb 2018 12:01:09 GMT</pubDate> <title/> <link>https://svn.boost.org/trac10/ticket/13012#comment:8 </link> <guid isPermaLink="false">https://svn.boost.org/trac10/ticket/13012#comment:8</guid> <description> <p> Hi John, </p> <p> This is terrific, thank you. I'm removing my own workaround then and relying on Boost.TypeTraits unconditionally, will report if something arises. </p> <ul><li>Do you plan to merge to release in time for 1.67? Just asking to keep Boost.PolyCollection in sync. </li><li>Two nitpicks: <ul><li><code>is_likely_lambda.hpp</code> might be more aptly named <code>is_likely_stateless_lambda.hpp</code>. </li><li>The copyright notice still points to <a href="http://www.boost.org/libs/poly_collection">http://www.boost.org/libs/poly_collection</a>, you might want to change that. </li></ul></li></ul><p> Thanks again </p> </description> <category>Ticket</category> </item> <item> <dc:creator>Joaquín M López Muñoz</dc:creator> <pubDate>Tue, 20 Feb 2018 08:57:29 GMT</pubDate> <title/> <link>https://svn.boost.org/trac10/ticket/13012#comment:9 </link> <guid isPermaLink="false">https://svn.boost.org/trac10/ticket/13012#comment:9</guid> <description> <p> Hi, </p> <p> I see that <code>boost::type_traits_detail::is_likely_stateless_lambda</code> defaults out for MSVC at </p> <p> <a class="ext-link" href="https://github.com/boostorg/type_traits/blob/5240cd67d895dd811ca708eb5faa835de73f25b8/include/boost/type_traits/detail/is_likely_lambda.hpp#L30"><span class="icon">​</span>https://github.com/boostorg/type_traits/blob/5240cd67d895dd811ca708eb5faa835de73f25b8/include/boost/type_traits/detail/is_likely_lambda.hpp#L30</a> </p> <p> but my local tests seem to show the lambda detection machinery indeed works for MSVC 14.0 --don't know about 12.0. Would it be possible to relax the aforementioned line so that MSVC &gt;=14.0 is accepted? </p> <p> Thank you </p> </description> <category>Ticket</category> </item> <item> <dc:creator>John Maddock</dc:creator> <pubDate>Tue, 20 Feb 2018 09:05:48 GMT</pubDate> <title/> <link>https://svn.boost.org/trac10/ticket/13012#comment:10 </link> <guid isPermaLink="false">https://svn.boost.org/trac10/ticket/13012#comment:10</guid> <description> <p> MSVC-14 uses the new "accurate" detection code and doesn't need/use the workaround. msvc-12 does need the workaround but can't compile it. </p> <p> Meanwhile I've just merged to master. </p> </description> <category>Ticket</category> </item> <item> <dc:creator>anonymous</dc:creator> <pubDate>Tue, 20 Feb 2018 09:36:52 GMT</pubDate> <title/> <link>https://svn.boost.org/trac10/ticket/13012#comment:11 </link> <guid isPermaLink="false">https://svn.boost.org/trac10/ticket/13012#comment:11</guid> <description> <p> Umm, Ive run the following in Visual Studio 2015 against develop </p> <pre class="wiki">#include &lt;boost/type_traits/has_equal_to.hpp&gt; #include &lt;iostream&gt; int main() { auto f=[](int){return 0;}; std::cout&lt;&lt;boost::has_equal_to&lt;decltype(f),decltype(f),bool&gt;::value&lt;&lt;"\n"; } </pre><p> and compiler fails with: </p> <pre class="wiki">1&gt;------ Build started: Project: sandbox, Configuration: Debug Win32 ------ 1&gt; sandbox.cpp 1&gt;d:\usr\joaquin\proyectos\boost-repo\trunk\boost\type_traits\detail\has_binary_operator.hpp(212): error C2593: 'operator ==' is ambiguous 1&gt; d:\usr\joaquin\proyectos\boost-repo\trunk\boost\type_traits\detail\has_binary_operator.hpp(124): note: could be 'boost::detail::has_equal_to_impl::no_operator boost::detail::has_equal_to_impl::operator ==(const boost::detail::has_equal_to_impl::any &amp;,const boost::detail::has_equal_to_impl::any &amp;)' 1&gt; d:\usr\joaquin\proyectos\boost-repo\trunk\boost\type_traits\detail\has_binary_operator.hpp(212): note: while trying to match the argument list '(main::&lt;lambda_7042359f6847725571dfbc3d7e478577&gt;, main::&lt;lambda_7042359f6847725571dfbc3d7e478577&gt;)' 1&gt; d:\usr\joaquin\proyectos\boost-repo\trunk\boost\type_traits\detail\has_binary_operator.hpp(233): note: see reference to class template instantiation 'boost::detail::has_equal_to_impl::operator_exists&lt;Lhs,Rhs&gt;' being compiled 1&gt; with 1&gt; [ 1&gt; Lhs=main::&lt;lambda_7042359f6847725571dfbc3d7e478577&gt;, 1&gt; Rhs=main::&lt;lambda_7042359f6847725571dfbc3d7e478577&gt; 1&gt; ] 1&gt; d:\usr\joaquin\proyectos\boost-repo\trunk\boost\type_traits\detail\has_binary_operator.hpp(262): note: see reference to class template instantiation 'boost::detail::has_equal_to_impl::trait_impl1&lt;main::&lt;lambda_7042359f6847725571dfbc3d7e478577&gt;,main::&lt;lambda_7042359f6847725571dfbc3d7e478577&gt;,Ret,false&gt;' being compiled 1&gt; with 1&gt; [ 1&gt; Ret=bool 1&gt; ] 1&gt; d:\usr\joaquin\proyectos\boost-repo\trunk\boost\type_traits\detail\has_binary_operator.hpp(270): note: see reference to class template instantiation 'boost::detail::has_equal_to_impl::trait_impl&lt;Lhs,Rhs,Ret&gt;' being compiled 1&gt; with 1&gt; [ 1&gt; Lhs=main::&lt;lambda_7042359f6847725571dfbc3d7e478577&gt;, 1&gt; Rhs=main::&lt;lambda_7042359f6847725571dfbc3d7e478577&gt;, 1&gt; Ret=bool 1&gt; ] 1&gt; d:\usr\joaquin\proyectos\poly_collection\sandbox\sandbox.cpp(9): note: see reference to class template instantiation 'boost::has_equal_to&lt;main::&lt;lambda_7042359f6847725571dfbc3d7e478577&gt;,main::&lt;lambda_7042359f6847725571dfbc3d7e478577&gt;,bool&gt;' being compiled 1&gt;d:\usr\joaquin\proyectos\boost-repo\trunk\boost\type_traits\detail\has_binary_operator.hpp(149): error C2593: 'operator ==' is ambiguous 1&gt; d:\usr\joaquin\proyectos\boost-repo\trunk\boost\type_traits\detail\has_binary_operator.hpp(124): note: could be 'boost::detail::has_equal_to_impl::no_operator boost::detail::has_equal_to_impl::operator ==(const boost::detail::has_equal_to_impl::any &amp;,const boost::detail::has_equal_to_impl::any &amp;)' 1&gt; d:\usr\joaquin\proyectos\boost-repo\trunk\boost\type_traits\detail\has_binary_operator.hpp(149): note: while trying to match the argument list '(main::&lt;lambda_7042359f6847725571dfbc3d7e478577&gt;, main::&lt;lambda_7042359f6847725571dfbc3d7e478577&gt;)' 1&gt; d:\usr\joaquin\proyectos\boost-repo\trunk\boost\type_traits\detail\has_binary_operator.hpp(233): note: see reference to class template instantiation 'boost::detail::has_equal_to_impl::operator_returns_void&lt;Lhs,Rhs&gt;' being compiled 1&gt; with 1&gt; [ 1&gt; Lhs=main::&lt;lambda_7042359f6847725571dfbc3d7e478577&gt;, 1&gt; Rhs=main::&lt;lambda_7042359f6847725571dfbc3d7e478577&gt; 1&gt; ] 1&gt;d:\usr\joaquin\proyectos\boost-repo\trunk\boost\type_traits\detail\has_binary_operator.hpp(194): error C2593: 'operator ==' is ambiguous 1&gt; d:\usr\joaquin\proyectos\boost-repo\trunk\boost\type_traits\detail\has_binary_operator.hpp(124): note: could be 'boost::detail::has_equal_to_impl::no_operator boost::detail::has_equal_to_impl::operator ==(const boost::detail::has_equal_to_impl::any &amp;,const boost::detail::has_equal_to_impl::any &amp;)' 1&gt; d:\usr\joaquin\proyectos\boost-repo\trunk\boost\type_traits\detail\has_binary_operator.hpp(194): note: while trying to match the argument list '(main::&lt;lambda_7042359f6847725571dfbc3d7e478577&gt;, main::&lt;lambda_7042359f6847725571dfbc3d7e478577&gt;)' 1&gt; d:\usr\joaquin\proyectos\boost-repo\trunk\boost\type_traits\detail\has_binary_operator.hpp(233): note: see reference to class template instantiation 'boost::detail::has_equal_to_impl::operator_returns_Ret&lt;Lhs,Rhs,Ret,false&gt;' being compiled 1&gt; with 1&gt; [ 1&gt; Lhs=main::&lt;lambda_7042359f6847725571dfbc3d7e478577&gt;, 1&gt; Rhs=main::&lt;lambda_7042359f6847725571dfbc3d7e478577&gt;, 1&gt; Ret=bool 1&gt; ] </pre> </description> <category>Ticket</category> </item> <item> <dc:creator>John Maddock</dc:creator> <pubDate>Tue, 20 Feb 2018 12:03:01 GMT</pubDate> <title/> <link>https://svn.boost.org/trac10/ticket/13012#comment:12 </link> <guid isPermaLink="false">https://svn.boost.org/trac10/ticket/13012#comment:12</guid> <description> <p> Works just fine for me, I'm guessing you have an obsolete VC2015 install (not updated), can you add: </p> <pre class="wiki">#ifdef BOOST_NO_SFINAE_EXPR #pragma message("BOOST_NO_SFINAE_EXPR is set") #endif #ifdef BOOST_NO_CXX11_DECLTYPE #pragma message("BOOST_NO_CXX11_DECLTYPE is set") #endif #ifdef BOOST_TT_HAS_ACCURATE_BINARY_OPERATOR_DETECTION #pragma message("BOOST_TT_HAS_ACCURATE_BINARY_OPERATOR_DETECTION is set") #endif #pragma message(BOOST_STRINGIZE(_MSC_FULL_VER)) </pre><p> To your test case? I get: </p> <pre class="wiki">BOOST_TT_HAS_ACCURATE_BINARY_OPERATOR_DETECTION is set 190024215 </pre> </description> <category>Ticket</category> </item> <item> <dc:creator>anonymous</dc:creator> <pubDate>Tue, 20 Feb 2018 13:59:59 GMT</pubDate> <title/> <link>https://svn.boost.org/trac10/ticket/13012#comment:13 </link> <guid isPermaLink="false">https://svn.boost.org/trac10/ticket/13012#comment:13</guid> <description> <p> Here I get: </p> <pre class="wiki">BOOST_NO_SFINAE_EXPR is set 190023026 </pre> </description> <category>Ticket</category> </item> <item> <dc:creator>John Maddock</dc:creator> <pubDate>Tue, 20 Feb 2018 17:28:26 GMT</pubDate> <title/> <link>https://svn.boost.org/trac10/ticket/13012#comment:14 </link> <guid isPermaLink="false">https://svn.boost.org/trac10/ticket/13012#comment:14</guid> <description> <p> OK that's a non-updated VS2015 install. Note that at the current time there is no way to download that version (you automatically get update 3), nor do we have any testers or CI for that version, so the official answer for that issue would always be "please update your visual studio install with the latest patches". </p> <p> However, if you can run some tests for me it would do no harm to add patches for that version, please just be aware that they will never be tested, so eventual breakage is not entirely unlikely. </p> <p> Can you cd into libs/type_traits/test and run: </p> <pre class="wiki">../../../b2 msvc-14.0 define=CI_SUPPRESS_KNOWN_ISSUES define=BOOST_TT_HAS_ACCURATE_BINARY_OPERATOR_DETECTION </pre><p> I'll assume that will generate errors, if so then inside is_likely_lambda.hpp change: </p> <pre class="wiki">#elif !defined(BOOST_NO_CXX11_LAMBDAS) &amp;&amp; !defined(BOOST_NO_CXX11_DECLTYPE) &amp;&amp; !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES) &amp;&amp; !defined(BOOST_MSVC) </pre><p> to </p> <pre class="wiki">#elif !defined(BOOST_NO_CXX11_LAMBDAS) &amp;&amp; !defined(BOOST_NO_CXX11_DECLTYPE) &amp;&amp; !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES) &amp;&amp; !BOOST_WORKAROUND(BOOST_MSVC, &lt; 1900) </pre><p> and run the tests again with: </p> <pre class="wiki">../../../b2 msvc-14.0 define=CI_SUPPRESS_KNOWN_ISSUES </pre><p> and report back? </p> <p> Thanks! </p> </description> <category>Ticket</category> </item> <item> <dc:creator>anonymous</dc:creator> <pubDate>Tue, 20 Feb 2018 18:18:06 GMT</pubDate> <title/> <link>https://svn.boost.org/trac10/ticket/13012#comment:15 </link> <guid isPermaLink="false">https://svn.boost.org/trac10/ticket/13012#comment:15</guid> <description> <p> Reporting back: </p> <ul><li>First <code>b2</code> run generated a lot of errors as you predicted. Please let me know if you want me to send you a logzip. </li><li>Did change the line in <code>is_likely_lambda.hpp</code> as instructed. </li><li>Second <code>b2</code> run failed two tests as follows: </li></ul><pre class="wiki">&gt;b2 msvc-14.0 define=CI_SUPPRESS_KNOWN_ISSUES Performing configuration checks - 32-bit : yes (cached) - arm : no (cached) - mips1 : no (cached) - power : no (cached) - sparc : no (cached) - x86 : yes (cached) - symlinks supported : no (cached) - junctions supported : yes (cached) - hardlinks supported : yes (cached) ...patience... ...found 3507 targets... ...updating 8 targets... testing.capture-output ..\..\..\bin.v2\libs\type_traits\test\has_nothrow_destruc tor_test.test\msvc-14.0\debug\threadapi-win32\threading-multi\has_nothrow_destru ctor_test.run ====== BEGIN OUTPUT ====== has_nothrow_destructor_test.cpp:194: &lt;note&gt;The expression: "::boost::has_nothrow _destructor&lt;UDT&gt;::value" did not have the value we wish it to have (found 0, exp ected 1)&lt;/note&gt; has_nothrow_destructor_test.cpp:195: &lt;note&gt;The expression: "::boost::has_nothrow _destructor&lt;empty_UDT&gt;::value" did not have the value we wish it to have (found 0, expected 1)&lt;/note&gt; has_nothrow_destructor_test.cpp:203: &lt;note&gt;The expression: "::boost::has_nothrow _destructor&lt;trivial_except_destroy&gt;::value" did not have the value we wish it to have (found 0, expected 1)&lt;/note&gt; has_nothrow_destructor_test.cpp:207: &lt;note&gt;The expression: "::boost::has_nothrow _destructor&lt;wrap&lt;trivial_except_destroy&gt; &gt;::value" did not have the value we wis h it to have (found 0, expected 1)&lt;/note&gt; has_nothrow_destructor_test.cpp:214: The expression: "::boost::has_nothrow_destr uctor&lt;noexcept_destruct&gt;::value" had an invalid value (found 0, expected 1) has_nothrow_destructor_test.cpp:215: The expression: "::boost::has_nothrow_destr uctor&lt;nothrow_destruct&gt;::value" had an invalid value (found 0, expected 1) EXIT STATUS: 2 ====== END OUTPUT ====== set status=0 if %status% NEQ 0 ( echo Skipping test execution due to testing.execute=off exit 0 ) "..\..\..\bin.v2\libs\type_traits\test\has_nothrow_destructor_test.test\msv c-14.0\debug\threadapi-win32\threading-multi\has_nothrow_destructor_test.exe" &gt; "..\..\..\bin.v2\libs\type_traits\test\has_nothrow_destructor_test.test\msvc-1 4.0\debug\threadapi-win32\threading-multi\has_nothrow_destructor_test.output" 2&gt; &amp;1 set status=%ERRORLEVEL% echo. &gt;&gt; "..\..\..\bin.v2\libs\type_traits\test\has_nothrow_destructor_test. test\msvc-14.0\debug\threadapi-win32\threading-multi\has_nothrow_destructor_test .output" echo EXIT STATUS: %status% &gt;&gt; "..\..\..\bin.v2\libs\type_traits\test\has_not hrow_destructor_test.test\msvc-14.0\debug\threadapi-win32\threading-multi\has_no throw_destructor_test.output" if %status% EQU 0 ( copy "..\..\..\bin.v2\libs\type_traits\test\has_nothrow_destructor_test. test\msvc-14.0\debug\threadapi-win32\threading-multi\has_nothrow_destructor_test .output" "..\..\..\bin.v2\libs\type_traits\test\has_nothrow_destructor_test.test \msvc-14.0\debug\threadapi-win32\threading-multi\has_nothrow_destructor_test.run " ) set verbose=0 if %status% NEQ 0 ( set verbose=1 ) if %verbose% EQU 1 ( echo ====== BEGIN OUTPUT ====== type "..\..\..\bin.v2\libs\type_traits\test\has_nothrow_destructor_test. test\msvc-14.0\debug\threadapi-win32\threading-multi\has_nothrow_destructor_test .output" echo ====== END OUTPUT ====== ) exit %status% ...failed testing.capture-output ..\..\..\bin.v2\libs\type_traits\test\has_nothr ow_destructor_test.test\msvc-14.0\debug\threadapi-win32\threading-multi\has_noth row_destructor_test.run... testing.capture-output ..\..\..\bin.v2\libs\type_traits\test\is_default_constr_t est.test\msvc-14.0\debug\threadapi-win32\threading-multi\is_default_constr_test. run ====== BEGIN OUTPUT ====== is_default_constr_test.cpp:200: The expression: "(::boost::is_default_constructi ble&lt;std::pair&lt;deleted_default_construct, int&gt; &gt;::value)" had an invalid value (f ound 1, expected 0) is_default_constr_test.cpp:204: The expression: "(::boost::is_default_constructi ble&lt;std::pair&lt;private_default_construct, int&gt; &gt;::value)" had an invalid value (f ound 1, expected 0) EXIT STATUS: 2 ====== END OUTPUT ====== failed to write output file '..\..\..\bin.v2\libs\type_traits\test\is_nothrow_mo ve_constructible_test_no_intrinsics.test\msvc-14.0\debug\threadapi-win32\threadi ng-multi\is_nothrow_move_constructible_test_no_intrinsics.exe.rsp'! set status=0 if %status% NEQ 0 ( echo Skipping test execution due to testing.execute=off exit 0 ) "..\..\..\bin.v2\libs\type_traits\test\is_default_constr_test.test\msvc-14. 0\debug\threadapi-win32\threading-multi\is_default_constr_test.exe" &gt; "..\..\. .\bin.v2\libs\type_traits\test\is_default_constr_test.test\msvc-14.0\debug\threa dapi-win32\threading-multi\is_default_constr_test.output" 2&gt;&amp;1 set status=%ERRORLEVEL% echo. &gt;&gt; "..\..\..\bin.v2\libs\type_traits\test\is_default_constr_test.test\ msvc-14.0\debug\threadapi-win32\threading-multi\is_default_constr_test.output" echo EXIT STATUS: %status% &gt;&gt; "..\..\..\bin.v2\libs\type_traits\test\is_defa ult_constr_test.test\msvc-14.0\debug\threadapi-win32\threading-multi\is_default_ constr_test.output" if %status% EQU 0 ( copy "..\..\..\bin.v2\libs\type_traits\test\is_default_constr_test.test\ msvc-14.0\debug\threadapi-win32\threading-multi\is_default_constr_test.output" " ..\..\..\bin.v2\libs\type_traits\test\is_default_constr_test.test\msvc-14.0\debu g\threadapi-win32\threading-multi\is_default_constr_test.run" ) set verbose=0 if %status% NEQ 0 ( set verbose=1 ) if %verbose% EQU 1 ( echo ====== BEGIN OUTPUT ====== type "..\..\..\bin.v2\libs\type_traits\test\is_default_constr_test.test\ msvc-14.0\debug\threadapi-win32\threading-multi\is_default_constr_test.output" echo ====== END OUTPUT ====== ) exit %status% ...failed testing.capture-output ..\..\..\bin.v2\libs\type_traits\test\is_defaul t_constr_test.test\msvc-14.0\debug\threadapi-win32\threading-multi\is_default_co nstr_test.run... </pre> </description> <category>Ticket</category> </item> <item> <dc:creator>anonymous</dc:creator> <pubDate>Wed, 21 Feb 2018 18:31:50 GMT</pubDate> <title/> <link>https://svn.boost.org/trac10/ticket/13012#comment:16 </link> <guid isPermaLink="false">https://svn.boost.org/trac10/ticket/13012#comment:16</guid> <description> <p> Thanks for that, pushed to develop, once CI has completed I'll merge to master. </p> </description> <category>Ticket</category> </item> <item> <dc:creator>anonymous</dc:creator> <pubDate>Thu, 22 Feb 2018 10:15:11 GMT</pubDate> <title/> <link>https://svn.boost.org/trac10/ticket/13012#comment:17 </link> <guid isPermaLink="false">https://svn.boost.org/trac10/ticket/13012#comment:17</guid> <description> <p> Thank you, happily using your improved <code>has_equal_to</code>, waiting for test runners to cycle before merging to master (hopefully in time for Boost 1.67). </p> </description> <category>Ticket</category> </item> </channel> </rss>