Add an `__is_inplace_index` metafunction.

Summary: This is used to constrain `variant`'s converting constructor correctly.

Reviewers: EricWF, mclow.lists

Reviewed By: EricWF, mclow.lists

Differential Revision: https://reviews.llvm.org/D34111

llvm-svn: 305370
Cr-Mirrored-From: sso://chromium.googlesource.com/_direct/external/github.com/llvm/llvm-project
Cr-Mirrored-Commit: 9cac9ad9d4b835f7f1da76dde865e358363e1e75
diff --git a/include/utility b/include/utility
index 958378b..00e3cd2 100644
--- a/include/utility
+++ b/include/utility
@@ -930,6 +930,12 @@
 template <class _Tp>
 using __is_inplace_type = __is_inplace_type_imp<__uncvref_t<_Tp>>;
 
+template <class _Tp> struct __is_inplace_index_imp : false_type {};
+template <size_t _Idx> struct __is_inplace_index_imp<in_place_index_t<_Idx>> : true_type {};
+
+template <class _Tp>
+using __is_inplace_index = __is_inplace_index_imp<__uncvref_t<_Tp>>;
+
 #endif // _LIBCPP_STD_VER > 14
 
 template <class _Arg, class _Result>