[cfe-dev] New C++0x feature support in Clang

Douglas Gregor dgregor at apple.com
Fri Feb 4 16:04:17 PST 2011


On Feb 4, 2011, at 2:23 PM, Larry Evans wrote:

> On 02/04/11 15:45, Douglas Gregor wrote:
>> 
>> On Feb 4, 2011, at 11:54 AM, Larry Evans wrote:
>> 
>>> On 02/04/11 13:38, Douglas Gregor wrote:
>>>> 
>>>> On Feb 4, 2011, at 11:33 AM, Larry Evans wrote:
>>>> 
>>>>> On 01/26/11 15:45, Douglas Gregor wrote:
>>>>>> Clang has recently gotten much-improved support for the upcoming
>>>>>> C++0x standard. In particular, top-of-tree Clang now supports a
>>>>>> number of C++0x features:
>>>>>> 
>>>>>> - Rvalue references (including rvalue references for *this)
>>>>>> - Variadic templates
>>>>>> - Inline namespaces
>>>>>> - Late-specified return types
>>>>>> - Decltype
>>>>>> 
>>>>>> You can turn on C++0x support with the -std=gnu++0x (or, if you want
>>>>>> to be more pedantic, -std=c++0x).
>>>>>> 
>>>>>> Give it a spin, write some tests, try it out with libc++, and tell us
>>>>>> how it went! And if you get the itch to hack on Clang, there are a
>>>>>> ton of other little C++0x features that you could implement.
>>>>>> 
>>>>>> Cheers,
>>>>>> Doug
>>>>> 
>>>>> How do I get the attached to compile without the
>>>>> following error about no std::move?
>>>>> 
>>>>> /home/evansl/download/llvm/svn/build/Debug+Asserts/bin/clang++ -c
>>>>> -std=c++0x -U__GXX_EXPERIMENTAL_CXX0X__ -c -std=c++0x move.cpp
>>>>> move.cpp:6:16: error: no member named 'move' in namespace 'std'
>>>>>  int j=std::move(i);
>>>>>        ~~~~~^
>>>> 
>>>> I suggest following the preprocessor logic to see what std::move isn't
>>>> getting defined. That -U__GXX_EXPERIMENTAL_CXX0X__ looks really, really
>>>> suspicious, though.
>>> 
>>> The -U is there because, without it, the errors begin with:
>>> 
>>> /home/evansl/download/llvm/svn/build/Debug+Asserts/bin/clang++ -c
>>> -std=c++0x -c -std=c++0x move.cpp
>>> In file included from move.cpp:1:
>>> In file included from /usr/include/c++/4.4/memory:48:
>>> In file included from /usr/include/c++/4.4/bits/stl_algobase.h:66:
>>> In file included from /usr/include/c++/4.4/bits/stl_pair.h:60:
>>> In file included from /usr/include/c++/4.4/bits/move.h:38:
>>> In file included from /usr/include/c++/4.4/type_traits:50:
>>> /usr/include/c++/4.4/tr1_impl/type_traits:233:29: error: type qualifier
>>> is not allowed on this function
>>>   struct is_function<_Res(_ArgTypes...) const>
>> 
>> FWIW, I implemented this extension in Clang shortly after you posted this.
>> 
>> - Doug
> 
> Thanks!  Quick work.
> 
> Did `svn update` in the llvm source and then `make` in the llvm build
> and now getting:
> 
> ~/prog_dev/clang $ make HOW=clangxx move
> /home/evansl/download/llvm/svn/build/Debug+Asserts/bin/clang++ -c
> -std=c++0x -c -std=c++0x move.cpp
> In file included from move.cpp:1:
> In file included from /usr/include/c++/4.4/memory:49:
> In file included from /usr/include/c++/4.4/bits/allocator.h:48:
> In file included from
> /usr/include/c++/4.4/x86_64-linux-gnu/bits/c++allocator.h:34:
> In file included from /usr/include/c++/4.4/ext/new_allocator.h:33:
> In file included from /usr/include/c++/4.4/new:40:
> In file included from /usr/include/c++/4.4/exception:148:
> /usr/include/c++/4.4/exception_ptr.h:143:13: error: unknown type name
> 'type_info'
>      const type_info*
>            ^
> In file included from move.cpp:1:
> In file included from /usr/include/c++/4.4/memory:48:
> In file included from /usr/include/c++/4.4/bits/stl_algobase.h:66:
> In file included from /usr/include/c++/4.4/bits/stl_pair.h:60:
> /usr/include/c++/4.4/bits/move.h:57:14: error: rvalue reference to type
> 'typename std::remove_reference<int &>::type'
>      (aka 'int') cannot bind to lvalue of type 'int'
>    { return __t; }
>             ^~~
> move.cpp:6:11: note: in instantiation of function template
> specialization 'std::move<int &>' requested here
>    int j=std::move(i);
>          ^

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++.

	- Doug

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20110204/ce91b96e/attachment.html>


More information about the cfe-dev mailing list