From a93ebeca94f812e18b4f465d98aad94f92220354 Mon Sep 17 00:00:00 2001 From: Eric Fiselier Date: Thu, 17 Nov 2016 20:08:43 +0000 Subject: [PATCH] Workaround compilers w/o C++1z inline variables git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@287255 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/__config | 5 +++++ include/utility | 15 ++++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/include/__config b/include/__config index e9d3e5ff2..a8603bead 100644 --- a/include/__config +++ b/include/__config @@ -796,6 +796,11 @@ template struct __static_assert_check {}; #define _LIBCPP_CONSTEXPR_AFTER_CXX14 #endif +// FIXME: Remove all usages of this macro once compilers catch up. +#if !defined(__cpp_inline_variables) || (__cpp_inline_variables < 201606L) +# define _LIBCPP_HAS_NO_INLINE_VARIABLES +#endif + #ifdef _LIBCPP_HAS_NO_RVALUE_REFERENCES # define _LIBCPP_EXPLICIT_MOVE(x) _VSTD::move(x) #else diff --git a/include/utility b/include/utility index 52c062ddd..364221433 100644 --- a/include/utility +++ b/include/utility @@ -897,21 +897,30 @@ _T1 exchange(_T1& __obj, _T2 && __new_value) struct _LIBCPP_TYPE_VIS in_place_t { explicit in_place_t() = default; }; -inline constexpr in_place_t in_place{}; +#ifndef _LIBCPP_HAS_NO_INLINE_VARIABLES +inline +#endif +constexpr in_place_t in_place{}; template struct _LIBCPP_TYPE_VIS in_place_type_t { explicit in_place_type_t() = default; }; template -inline constexpr in_place_type_t<_Tp> in_place_type{}; +#ifndef _LIBCPP_HAS_NO_INLINE_VARIABLES +inline +#endif +constexpr in_place_type_t<_Tp> in_place_type{}; template struct _LIBCPP_TYPE_VIS in_place_index_t { explicit in_place_index_t() = default; }; template -inline constexpr in_place_index_t<_Idx> in_place_index{}; +#ifndef _LIBCPP_HAS_NO_INLINE_VARIABLES +inline +#endif +constexpr in_place_index_t<_Idx> in_place_index{}; template struct __is_inplace_type_imp : false_type {}; template struct __is_inplace_type_imp> : true_type {};