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 {};