<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div>On Jan 24, 2011, at 6:07 PM, Howard Hinnant wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div>Thanks Doug.<br><br>Ultimately I'd like to see is_convertible mapped into a compiler intrinsic.<br></div></blockquote><div><br></div><div>Yeah, I agree that that would make sense. But, not until we've knocked off a few more C++0x features that libc++ needs!</div><div><br></div><div>  - Doug</div><br><blockquote type="cite"><div>-Howard<br><br>On Jan 24, 2011, at 8:15 PM, Douglas Gregor wrote:<br><br><blockquote type="cite">Author: dgregor<br></blockquote><blockquote type="cite">Date: Mon Jan 24 19:15:41 2011<br></blockquote><blockquote type="cite">New Revision: 124166<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">URL: <a href="http://llvm.org/viewvc/llvm-project?rev=124166&view=rev">http://llvm.org/viewvc/llvm-project?rev=124166&view=rev</a><br></blockquote><blockquote type="cite">Log:<br></blockquote><blockquote type="cite">Eliminate the C++0x-only is_convertible testing function that accepts<br></blockquote><blockquote type="cite">a cv-qualifier rvalue reference to the type, e.g.,<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"> template <class _Tp> char  __test(const volatile typename remove_reference<_Tp>::type&&);<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">The use of this function signature rather than the more<br></blockquote><blockquote type="cite">straightforward one used in C++98/03 mode, e.g.,<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"> template <class _Tp> char  __test(_Tp);<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">is broken in two ways:<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"> 1) An rvalue reference cannot bind to lvalues, so is_convertible<X&,<br></blockquote><blockquote type="cite"> X&>::value would be false. This breaks two of the unique_ptr tests<br></blockquote><blockquote type="cite"> on Clang and GCC >= 4.5. Prior GCC's seem to have allowed rvalue<br></blockquote><blockquote type="cite"> references to bind to lvalues, allowing this bug to slip in.<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"> 2) By adding cv-qualifiers to the type we're converting to, we get<br></blockquote><blockquote type="cite"> some incorrect "true" results for, e.g., is_convertible<const X&, X&>::value.<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">Modified:<br></blockquote><blockquote type="cite">   libcxx/trunk/include/type_traits<br></blockquote><blockquote type="cite">   libcxx/trunk/test/utilities/meta/meta.rel/is_convertible.pass.cpp<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">Modified: libcxx/trunk/include/type_traits<br></blockquote><blockquote type="cite">URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/type_traits?rev=124166&r1=124165&r2=124166&view=diff">http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/type_traits?rev=124166&r1=124165&r2=124166&view=diff</a><br></blockquote><blockquote type="cite">==============================================================================<br></blockquote><blockquote type="cite">--- libcxx/trunk/include/type_traits (original)<br></blockquote><blockquote type="cite">+++ libcxx/trunk/include/type_traits Mon Jan 24 19:15:41 2011<br></blockquote><blockquote type="cite">@@ -600,11 +600,7 @@<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">namespace __is_convertible_imp<br></blockquote><blockquote type="cite">{<br></blockquote><blockquote type="cite">-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES<br></blockquote><blockquote type="cite">-template <class _Tp> char  __test(const volatile typename remove_reference<_Tp>::type&&);<br></blockquote><blockquote type="cite">-#else<br></blockquote><blockquote type="cite">template <class _Tp> char  __test(_Tp);<br></blockquote><blockquote type="cite">-#endif<br></blockquote><blockquote type="cite">template <class _Tp> __two __test(...);<br></blockquote><blockquote type="cite">#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES<br></blockquote><blockquote type="cite">template <class _Tp> _Tp&& __source();<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">Modified: libcxx/trunk/test/utilities/meta/meta.rel/is_convertible.pass.cpp<br></blockquote><blockquote type="cite">URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/meta/meta.rel/is_convertible.pass.cpp?rev=124166&r1=124165&r2=124166&view=diff">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/meta/meta.rel/is_convertible.pass.cpp?rev=124166&r1=124165&r2=124166&view=diff</a><br></blockquote><blockquote type="cite">==============================================================================<br></blockquote><blockquote type="cite">--- libcxx/trunk/test/utilities/meta/meta.rel/is_convertible.pass.cpp (original)<br></blockquote><blockquote type="cite">+++ libcxx/trunk/test/utilities/meta/meta.rel/is_convertible.pass.cpp Mon Jan 24 19:15:41 2011<br></blockquote><blockquote type="cite">@@ -16,6 +16,10 @@<br></blockquote><blockquote type="cite">typedef void Function();<br></blockquote><blockquote type="cite">typedef char Array[1];<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">+class NonCopyable {<br></blockquote><blockquote type="cite">+  NonCopyable(NonCopyable&);<br></blockquote><blockquote type="cite">+};<br></blockquote><blockquote type="cite">+<br></blockquote><blockquote type="cite">int main()<br></blockquote><blockquote type="cite">{<br></blockquote><blockquote type="cite">    {<br></blockquote><blockquote type="cite">@@ -366,4 +370,15 @@<br></blockquote><blockquote type="cite">    static_assert((!std::is_convertible<const char*, char*>::value), "");<br></blockquote><blockquote type="cite">    static_assert(( std::is_convertible<const char*, const char*>::value), "");<br></blockquote><blockquote type="cite">    }<br></blockquote><blockquote type="cite">+    {<br></blockquote><blockquote type="cite">+    static_assert((std::is_convertible<NonCopyable&, NonCopyable&>::value), "");<br></blockquote><blockquote type="cite">+    static_assert((std::is_convertible<NonCopyable&, const NonCopyable&>::value), "");<br></blockquote><blockquote type="cite">+    static_assert((std::is_convertible<NonCopyable&, const volatile NonCopyable&>::value), "");<br></blockquote><blockquote type="cite">+    static_assert((std::is_convertible<NonCopyable&, volatile NonCopyable&>::value), "");<br></blockquote><blockquote type="cite">+    static_assert((std::is_convertible<const NonCopyable&, const NonCopyable&>::value), "");<br></blockquote><blockquote type="cite">+    static_assert((std::is_convertible<const NonCopyable&, const volatile NonCopyable&>::value), "");<br></blockquote><blockquote type="cite">+    static_assert((std::is_convertible<volatile NonCopyable&, const volatile NonCopyable&>::value), "");<br></blockquote><blockquote type="cite">+    static_assert((std::is_convertible<const volatile NonCopyable&, const volatile NonCopyable&>::value), "");<br></blockquote><blockquote type="cite">+    static_assert((!std::is_convertible<const NonCopyable&, NonCopyable&>::value), "");<br></blockquote><blockquote type="cite">+    }<br></blockquote><blockquote type="cite">}<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">_______________________________________________<br></blockquote><blockquote type="cite">cfe-commits mailing list<br></blockquote><blockquote type="cite"><a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br></blockquote><blockquote type="cite"><a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br></blockquote><br></div></blockquote></div><br></body></html>