forked from OSchip/llvm-project
Ensure bitset's string constructor doesn't poison the overload set.
llvm-svn: 364842
This commit is contained in:
parent
c9f14f29f5
commit
d1523f7a8c
|
@ -679,7 +679,7 @@ public:
|
||||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR bitset() _NOEXCEPT {}
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR bitset() _NOEXCEPT {}
|
||||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||||
bitset(unsigned long long __v) _NOEXCEPT : base(__v) {}
|
bitset(unsigned long long __v) _NOEXCEPT : base(__v) {}
|
||||||
template<class _CharT>
|
template<class _CharT, class = _EnableIf<_IsCharLikeType<_CharT>::value> >
|
||||||
explicit bitset(const _CharT* __str,
|
explicit bitset(const _CharT* __str,
|
||||||
typename basic_string<_CharT>::size_type __n = basic_string<_CharT>::npos,
|
typename basic_string<_CharT>::size_type __n = basic_string<_CharT>::npos,
|
||||||
_CharT __zero = _CharT('0'), _CharT __one = _CharT('1'));
|
_CharT __zero = _CharT('0'), _CharT __one = _CharT('1'));
|
||||||
|
@ -760,7 +760,7 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
template <size_t _Size>
|
template <size_t _Size>
|
||||||
template<class _CharT>
|
template<class _CharT, class>
|
||||||
bitset<_Size>::bitset(const _CharT* __str,
|
bitset<_Size>::bitset(const _CharT* __str,
|
||||||
typename basic_string<_CharT>::size_type __n,
|
typename basic_string<_CharT>::size_type __n,
|
||||||
_CharT __zero, _CharT __one)
|
_CharT __zero, _CharT __one)
|
||||||
|
|
|
@ -4006,6 +4006,10 @@ inline constexpr bool is_constant_evaluated() noexcept {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
template <class _CharT>
|
||||||
|
using _IsCharLikeType = _And<is_standard_layout<_CharT>, is_trivial<_CharT> >;
|
||||||
|
|
||||||
_LIBCPP_END_NAMESPACE_STD
|
_LIBCPP_END_NAMESPACE_STD
|
||||||
|
|
||||||
#if _LIBCPP_STD_VER > 14
|
#if _LIBCPP_STD_VER > 14
|
||||||
|
|
|
@ -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**)
|
int main(int, char**)
|
||||||
{
|
{
|
||||||
test_string_ctor<0>();
|
test_string_ctor<0>();
|
||||||
|
@ -85,6 +97,7 @@ int main(int, char**)
|
||||||
test_string_ctor<64>();
|
test_string_ctor<64>();
|
||||||
test_string_ctor<65>();
|
test_string_ctor<65>();
|
||||||
test_string_ctor<1000>();
|
test_string_ctor<1000>();
|
||||||
|
test_for_non_eager_instantiation();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue