Vendor import of libc++ 6.0.1 release r335540:

https://llvm.org/svn/llvm-project/libcxx/tags/RELEASE_601/final@335540
This commit is contained in:
Dimitry Andric 2018-06-27 19:14:54 +00:00
parent 6100a9db7d
commit 04505aa466
4 changed files with 93 additions and 28 deletions

View File

@ -2058,15 +2058,15 @@ list<_Tp, _Alloc>::splice(const_iterator __p, list& __c, const_iterator __f, con
#endif
if (__f != __l)
{
if (this != &__c)
{
size_type __s = _VSTD::distance(__f, __l);
__c.__sz() -= __s;
base::__sz() += __s;
}
__link_pointer __first = __f.__ptr_;
--__l;
__link_pointer __last = __l.__ptr_;
if (this != &__c)
{
size_type __s = _VSTD::distance(__f, __l) + 1;
__c.__sz() -= __s;
base::__sz() += __s;
}
base::__unlink_nodes(__first, __last);
__link_nodes(__p.__ptr_, __first, __last);
#if _LIBCPP_DEBUG_LEVEL >= 2

View File

@ -18,7 +18,7 @@ bool uncaught_exception() _NOEXCEPT { return uncaught_exceptions() > 0; }
int uncaught_exceptions() _NOEXCEPT
{
# if _LIBCPPABI_VERSION > 1101
# if _LIBCPPABI_VERSION > 1001
return __cxa_uncaught_exceptions();
# else
return __cxa_uncaught_exception() ? 1 : 0;

View File

@ -42,6 +42,7 @@ public:
Base::run();
try {
FrontOnEmptyContainer();
if constexpr (CT != CT_ForwardList) {
AssignInvalidates();
BackOnEmptyContainer();
@ -50,6 +51,8 @@ public:
InsertIterIterIter();
EmplaceIterValue();
EraseIterIter();
} else {
SpliceFirstElemAfter();
}
if constexpr (CT == CT_Vector || CT == CT_Deque || CT == CT_List) {
PopBack();
@ -57,12 +60,66 @@ public:
if constexpr (CT == CT_List || CT == CT_Deque) {
PopFront(); // FIXME: Run with forward list as well
}
if constexpr (CT == CT_List || CT == CT_ForwardList) {
RemoveFirstElem();
}
if constexpr (CT == CT_List) {
SpliceFirstElem();
}
} catch (...) {
assert(false && "uncaught debug exception");
}
}
private:
static void RemoveFirstElem() {
// See llvm.org/PR35564
CHECKPOINT("remove(<first-elem>)");
{
Container C = makeContainer(1);
auto FirstVal = *(C.begin());
C.remove(FirstVal);
assert(C.empty());
}
{
Container C = {1, 1, 1, 1};
auto FirstVal = *(C.begin());
C.remove(FirstVal);
assert(C.empty());
}
}
static void SpliceFirstElem() {
// See llvm.org/PR35564
CHECKPOINT("splice(<first-elem>)");
{
Container C = makeContainer(1);
Container C2;
C2.splice(C2.end(), C, C.begin(), ++C.begin());
}
{
Container C = makeContainer(1);
Container C2;
C2.splice(C2.end(), C, C.begin());
}
}
static void SpliceFirstElemAfter() {
// See llvm.org/PR35564
CHECKPOINT("splice(<first-elem>)");
{
Container C = makeContainer(1);
Container C2;
C2.splice_after(C2.begin(), C, C.begin(), ++C.begin());
}
{
Container C = makeContainer(1);
Container C2;
C2.splice_after(C2.begin(), C, C.begin());
}
}
static void AssignInvalidates() {
CHECKPOINT("assign(Size, Value)");
Container C(allocator_type{});

View File

@ -15,40 +15,48 @@
// XFAIL: availability=macosx10.9
// XFAIL: availability=macosx10.10
// XFAIL: availability=macosx10.11
// XFAIL: with_system_cxx_lib=macosx10.12
// XFAIL: with_system_cxx_lib=macosx10.13
// test uncaught_exceptions
#include <exception>
#include <cassert>
struct A
{
~A()
{
assert(std::uncaught_exceptions() > 0);
struct Uncaught {
Uncaught(int depth) : d_(depth) {}
~Uncaught() { assert(std::uncaught_exceptions() == d_); }
int d_;
};
struct Outer {
Outer(int depth) : d_(depth) {}
~Outer() {
try {
assert(std::uncaught_exceptions() == d_);
Uncaught u(d_+1);
throw 2;
}
catch (int) {}
}
int d_;
};
struct B
{
B()
int main () {
assert(std::uncaught_exceptions() == 0);
{
// http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#475
assert(std::uncaught_exceptions() == 0);
Outer o(0);
}
};
int main()
{
try
assert(std::uncaught_exceptions() == 0);
{
A a;
try {
Outer o(1);
throw 1;
}
catch (int) {
assert(std::uncaught_exceptions() == 0);
throw B();
}
catch (...)
{
assert(std::uncaught_exception() == 0);
}
}
assert(std::uncaught_exceptions() == 0);
}