[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