diff options
author | Eric Fiselier <eric@efcs.ca> | 2019-07-01 19:59:34 +0000 |
---|---|---|
committer | Eric Fiselier <eric@efcs.ca> | 2019-07-01 19:59:34 +0000 |
commit | d1523f7a8c2247adfee559b127206a40ce4b2591 (patch) | |
tree | 5627911f3dd58b414d79aec91e7a617e49c052d9 | |
parent | c9f14f29f5c5338ec00c5946c76bf6ea2d8fb7d8 (diff) | |
download | bcm5719-llvm-d1523f7a8c2247adfee559b127206a40ce4b2591.tar.gz bcm5719-llvm-d1523f7a8c2247adfee559b127206a40ce4b2591.zip |
Ensure bitset's string constructor doesn't poison the overload set.
llvm-svn: 364842
-rw-r--r-- | libcxx/include/bitset | 4 | ||||
-rw-r--r-- | libcxx/include/type_traits | 4 | ||||
-rw-r--r-- | libcxx/test/std/utilities/template.bitset/bitset.cons/string_ctor.pass.cpp | 13 |
3 files changed, 19 insertions, 2 deletions
diff --git a/libcxx/include/bitset b/libcxx/include/bitset index 9fb91e9bd54..4755fbeb215 100644 --- a/libcxx/include/bitset +++ b/libcxx/include/bitset @@ -679,7 +679,7 @@ public: _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 @@ private: }; 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/libcxx/include/type_traits b/libcxx/include/type_traits index cdb252cbac6..3b09c59622c 100644 --- a/libcxx/include/type_traits +++ b/libcxx/include/type_traits @@ -4006,6 +4006,10 @@ inline constexpr bool is_constant_evaluated() noexcept { } #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/libcxx/test/std/utilities/template.bitset/bitset.cons/string_ctor.pass.cpp b/libcxx/test/std/utilities/template.bitset/bitset.cons/string_ctor.pass.cpp index 453db91f29d..b08449ce8eb 100644 --- a/libcxx/test/std/utilities/template.bitset/bitset.cons/string_ctor.pass.cpp +++ b/libcxx/test/std/utilities/template.bitset/bitset.cons/string_ctor.pass.cpp @@ -74,6 +74,18 @@ void test_string_ctor() } } +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 @@ int main(int, char**) test_string_ctor<64>(); test_string_ctor<65>(); test_string_ctor<1000>(); + test_for_non_eager_instantiation(); return 0; } |