<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>On Feb 4, 2011, at 2:23 PM, Larry Evans wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div>On 02/04/11 15:45, Douglas Gregor wrote:<br><blockquote type="cite"><br></blockquote><blockquote type="cite">On Feb 4, 2011, at 11:54 AM, Larry Evans wrote:<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><blockquote type="cite">On 02/04/11 13:38, Douglas Gregor wrote:<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">On Feb 4, 2011, at 11:33 AM, Larry Evans wrote:<br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">On 01/26/11 15:45, Douglas Gregor wrote:<br></blockquote></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">Clang has recently gotten much-improved support for the upcoming<br></blockquote></blockquote></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">C++0x standard. In particular, top-of-tree Clang now supports a<br></blockquote></blockquote></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">number of C++0x features:<br></blockquote></blockquote></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">- Rvalue references (including rvalue references for *this)<br></blockquote></blockquote></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">- Variadic templates<br></blockquote></blockquote></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">- Inline namespaces<br></blockquote></blockquote></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">- Late-specified return types<br></blockquote></blockquote></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">- Decltype<br></blockquote></blockquote></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">You can turn on C++0x support with the -std=gnu++0x (or, if you want<br></blockquote></blockquote></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">to be more pedantic, -std=c++0x).<br></blockquote></blockquote></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">Give it a spin, write some tests, try it out with libc++, and tell us<br></blockquote></blockquote></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">how it went! And if you get the itch to hack on Clang, there are a<br></blockquote></blockquote></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">ton of other little C++0x features that you could implement.<br></blockquote></blockquote></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">Cheers,<br></blockquote></blockquote></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">Doug<br></blockquote></blockquote></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">How do I get the attached to compile without the<br></blockquote></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">following error about no std::move?<br></blockquote></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">/home/evansl/download/llvm/svn/build/Debug+Asserts/bin/clang++ -c<br></blockquote></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">-std=c++0x -U__GXX_EXPERIMENTAL_CXX0X__ -c -std=c++0x move.cpp<br></blockquote></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">move.cpp:6:16: error: no member named 'move' in namespace 'std'<br></blockquote></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">  int j=std::move(i);<br></blockquote></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">        ~~~~~^<br></blockquote></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">I suggest following the preprocessor logic to see what std::move isn't<br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">getting defined. That -U__GXX_EXPERIMENTAL_CXX0X__ looks really, really<br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">suspicious, though.<br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">The -U is there because, without it, the errors begin with:<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">/home/evansl/download/llvm/svn/build/Debug+Asserts/bin/clang++ -c<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">-std=c++0x -c -std=c++0x move.cpp<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">In file included from move.cpp:1:<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">In file included from /usr/include/c++/4.4/memory:48:<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">In file included from /usr/include/c++/4.4/bits/stl_algobase.h:66:<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">In file included from /usr/include/c++/4.4/bits/stl_pair.h:60:<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">In file included from /usr/include/c++/4.4/bits/move.h:38:<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">In file included from /usr/include/c++/4.4/type_traits:50:<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">/usr/include/c++/4.4/tr1_impl/type_traits:233:29: error: type qualifier<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">is not allowed on this function<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">   struct is_function<_Res(_ArgTypes...) const><br></blockquote></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">FWIW, I implemented this extension in Clang shortly after you posted this.<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">- Doug<br></blockquote><br>Thanks!  Quick work.<br><br>Did `svn update` in the llvm source and then `make` in the llvm build<br>and now getting:<br><br>~/prog_dev/clang $ make HOW=clangxx move<br>/home/evansl/download/llvm/svn/build/Debug+Asserts/bin/clang++ -c<br>-std=c++0x -c -std=c++0x move.cpp<br>In file included from move.cpp:1:<br>In file included from /usr/include/c++/4.4/memory:49:<br>In file included from /usr/include/c++/4.4/bits/allocator.h:48:<br>In file included from<br>/usr/include/c++/4.4/x86_64-linux-gnu/bits/c++allocator.h:34:<br>In file included from /usr/include/c++/4.4/ext/new_allocator.h:33:<br>In file included from /usr/include/c++/4.4/new:40:<br>In file included from /usr/include/c++/4.4/exception:148:<br>/usr/include/c++/4.4/exception_ptr.h:143:13: error: unknown type name<br>'type_info'<br>      const type_info*<br>            ^<br>In file included from move.cpp:1:<br>In file included from /usr/include/c++/4.4/memory:48:<br>In file included from /usr/include/c++/4.4/bits/stl_algobase.h:66:<br>In file included from /usr/include/c++/4.4/bits/stl_pair.h:60:<br>/usr/include/c++/4.4/bits/move.h:57:14: error: rvalue reference to type<br>'typename std::remove_reference<int &>::type'<br>      (aka 'int') cannot bind to lvalue of type 'int'<br>    { return __t; }<br>             ^~~<br>move.cpp:6:11: note: in instantiation of function template<br>specialization 'std::move<int &>' requested here<br>    int j=std::move(i);<br>          ^<br></div></blockquote><br></div><div>This, unfortunately, may be an insurmountable problem. The code was written to a prior version of the rvalue references proposal, which allowing binding rvalue references to lvalues. That code is ill-formed under the current C++0x semantics for rvalue references. We're not going to be providing compatibility with early implementations of the GNU C++0x support, so it looks like we either need to wait until we have all of the C++0x features needed for a newer libstdc++, or just use libc++.</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">      </span>- Doug</div><br></body></html>