[PATCH] [libc++] In C++11 GNU extension mode, start emulating libstdc++'s use of constexpr.

Howard Hinnant howard.hinnant at gmail.com
Wed Nov 27 15:31:52 PST 2013


On Nov 26, 2013, at 5:04 PM, Peter Collingbourne <peter at pcc.me.uk> wrote:

> Hi rsmith, howard.hinnant,
> 
> libstdc++ always declares various entities as constexpr if C++14 makes
> them constexpr, even in C++11 mode. To support programs which rely on this
> behavior, start applying constexpr to those entities in C++11 mode only if
> GNU extensions are enabled (i.e. -std=gnu++11).
> 
> We have to be selective about which entities we do this for because of the
> relaxed constexpr rules in C++14.
> 
> This patch applies the change to entities in <utility>, as well as its
> dependencies, std::move and std::forward.
> 
> http://llvm-reviews.chandlerc.com/D2276
> 
> Files:
>  include/__config
>  include/__tuple
>  include/type_traits
>  include/utility
>  test/utilities/utility/pairs/pair.astuple/get_const.pass.cpp
>  test/utilities/utility/pairs/pair.astuple/get_non_const.pass.cpp
>  test/utilities/utility/pairs/pair.astuple/pairs.by.type1.fail.cpp
>  test/utilities/utility/pairs/pair.astuple/pairs.by.type2.fail.cpp
>  test/utilities/utility/pairs/pair.astuple/pairs.by.type3.fail.cpp
>  test/utilities/utility/pairs/pairs.pair/const_first_const_second.pass.cpp
>  test/utilities/utility/pairs/pairs.pair/const_pair_U_V.pass.cpp
>  test/utilities/utility/pairs/pairs.pair/copy_ctor.pass.cpp
>  test/utilities/utility/pairs/pairs.pair/default.pass.cpp
>  test/utilities/utility/pairs/pairs.spec/comparison.pass.cpp
>  test/utilities/utility/pairs/pairs.spec/make_pair.pass.cpp
> <D2276.1.patch>

I find myself wondering if the following would not be simpler and more flexible:

In <__config>:

#if _LIBCPP_STD_VER <= 11
#  ifndef _LIBCPP_CONSTEXPR_AFTER_CXX11
#    define _LIBCPP_CONSTEXPR_AFTER_CXX11
#  endif
#  define _LIBCPP_EXPLICIT_AFTER_CXX11
#  define _LIBCPP_DEPRECATED_AFTER_CXX11
#else
#  ifndef _LIBCPP_CONSTEXPR_AFTER_CXX11
#    define _LIBCPP_CONSTEXPR_AFTER_CXX11 constexpr
#  endif
#  define _LIBCPP_EXPLICIT_AFTER_CXX11 explicit
#  define _LIBCPP_DEPRECATED_AFTER_CXX11 [[deprecated]]
#endif

I.e. Allow the client to define _LIBCPP_CONSTEXPR_AFTER_CXX11 however he wants.  And if he does, his definition is respected.  Otherwise it defaults to how it is currently defined with _LIBCPP_STD_VER <= 11.

Howard





More information about the cfe-commits mailing list