[PATCH] D11394: Fix warnings about pessimizing return moves for C++11 and higher

Arthur O'Dwyer arthur.j.odwyer at gmail.com
Tue Jul 21 17:24:44 PDT 2015


>From the peanut gallery: Could someone explain why this warning is actually
a false positive in C++03 mode? It seems to me that the std::move there
disables NRVO in C++03 to exactly the same degree as it disables NRVO in
C++11. Admittedly I have no idea what _VSTD::move(x) does to x in C++03
mode; I'd have expected it to be a no-op, except for disabling RVO.

–Arthur


On Tue, Jul 21, 2015 at 12:19 PM, Dimitry Andric <dimitry at andric.com> wrote:

> dim created this revision.
> dim added reviewers: mclow.lists, EricWF, howard.hinnant.
> dim added a subscriber: cfe-commits.
>
> Throughout the libc++ headers, there are a few instances where
> _VSTD::move() is used to return a local variable.  Howard commented in
> r189039 that these were there "for non-obvious reasons such as to help
> things limp along in C++03 language mode".
>
> However, when compiling these headers with warnings on, and in C++11 or
> higher mode (like we do in FreeBSD), they cause the following complaints
> about pessimizing moves:
>
>     In file included from tests.cpp:26:
>     In file included from tests.hpp:29:
>     /usr/include/c++/v1/map:1368:12: error: moving a local object in a
> return statement prevents copy elision [-Werror,-Wpessimizing-move]
>         return _VSTD::move(__h);  // explicitly moved for C++03
>                ^
>     /usr/include/c++/v1/__config:368:15: note: expanded from macro '_VSTD'
>     #define _VSTD std::_LIBCPP_NAMESPACE
>                   ^
>
> Attempt to fix this by adding a _LIBCPP_EXPLICIT_MOVE() macro to
> __config, which gets defined to _VSTD::move for pre-C++11, and to
> nothing for C++11 and later.
>
> I am not completely satisfied with the macro name (I also considered
> _LIBCPP_COMPAT_MOVE and some other variants), so suggestions are
> welcome. :)
>
> http://reviews.llvm.org/D11394
>
> Files:
>   include/__config
>   include/__hash_table
>   include/__tree
>   include/algorithm
>   include/ext/hash_map
>   include/map
>   include/unordered_map
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150721/850e4fb5/attachment.html>


More information about the cfe-commits mailing list