Ensure bitset's string constructor doesn't poison the overload set.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@364842 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/bitset b/include/bitset
index 9fb91e9..4755fbe 100644
--- a/include/bitset
+++ b/include/bitset
@@ -679,7 +679,7 @@
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR bitset() _NOEXCEPT {}
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
bitset(unsigned long long __v) _NOEXCEPT : base(__v) {}
- template<class _CharT>
+ template<class _CharT, class = _EnableIf<_IsCharLikeType<_CharT>::value> >
explicit bitset(const _CharT* __str,
typename basic_string<_CharT>::size_type __n = basic_string<_CharT>::npos,
_CharT __zero = _CharT('0'), _CharT __one = _CharT('1'));
@@ -760,7 +760,7 @@
};
template <size_t _Size>
-template<class _CharT>
+template<class _CharT, class>
bitset<_Size>::bitset(const _CharT* __str,
typename basic_string<_CharT>::size_type __n,
_CharT __zero, _CharT __one)
diff --git a/include/type_traits b/include/type_traits
index cdb252c..3b09c59 100644
--- a/include/type_traits
+++ b/include/type_traits
@@ -4006,6 +4006,10 @@
}
#endif
+
+template <class _CharT>
+using _IsCharLikeType = _And<is_standard_layout<_CharT>, is_trivial<_CharT> >;
+
_LIBCPP_END_NAMESPACE_STD
#if _LIBCPP_STD_VER > 14
diff --git a/test/std/utilities/template.bitset/bitset.cons/string_ctor.pass.cpp b/test/std/utilities/template.bitset/bitset.cons/string_ctor.pass.cpp
index 453db91..b08449c 100644
--- a/test/std/utilities/template.bitset/bitset.cons/string_ctor.pass.cpp
+++ b/test/std/utilities/template.bitset/bitset.cons/string_ctor.pass.cpp
@@ -74,6 +74,18 @@
}
}
+struct Nonsense {
+ virtual ~Nonsense() {}
+};
+
+void test_for_non_eager_instantiation() {
+ // Ensure we don't accidentally instantiate `std::basic_string<Nonsense>`
+ // since it may not be well formed and can cause an error in the
+ // non-immediate context.
+ static_assert(!std::is_constructible<std::bitset<3>, Nonsense*>::value, "");
+ static_assert(!std::is_constructible<std::bitset<3>, Nonsense*, size_t, Nonsense&, Nonsense&>::value, "");
+}
+
int main(int, char**)
{
test_string_ctor<0>();
@@ -85,6 +97,7 @@
test_string_ctor<64>();
test_string_ctor<65>();
test_string_ctor<1000>();
+ test_for_non_eager_instantiation();
return 0;
}