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

Dimitry Andric dimitry at andric.com
Tue Jul 21 12:19:04 PDT 2015


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

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D11394.30278.patch
Type: text/x-patch
Size: 3875 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150721/7fbc52fb/attachment.bin>


More information about the cfe-commits mailing list