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 #endif
if (__f != __l) if (__f != __l)
{ {
if (this != &__c)
{
size_type __s = _VSTD::distance(__f, __l);
__c.__sz() -= __s;
base::__sz() += __s;
}
__link_pointer __first = __f.__ptr_; __link_pointer __first = __f.__ptr_;
--__l; --__l;
__link_pointer __last = __l.__ptr_; __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); base::__unlink_nodes(__first, __last);
__link_nodes(__p.__ptr_, __first, __last); __link_nodes(__p.__ptr_, __first, __last);
#if _LIBCPP_DEBUG_LEVEL >= 2 #if _LIBCPP_DEBUG_LEVEL >= 2

View File

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

View File

@ -42,6 +42,7 @@ public:
Base::run(); Base::run();
try { try {
FrontOnEmptyContainer(); FrontOnEmptyContainer();
if constexpr (CT != CT_ForwardList) { if constexpr (CT != CT_ForwardList) {
AssignInvalidates(); AssignInvalidates();
BackOnEmptyContainer(); BackOnEmptyContainer();
@ -50,6 +51,8 @@ public:
InsertIterIterIter(); InsertIterIterIter();
EmplaceIterValue(); EmplaceIterValue();
EraseIterIter(); EraseIterIter();
} else {
SpliceFirstElemAfter();
} }
if constexpr (CT == CT_Vector || CT == CT_Deque || CT == CT_List) { if constexpr (CT == CT_Vector || CT == CT_Deque || CT == CT_List) {
PopBack(); PopBack();
@ -57,12 +60,66 @@ public:
if constexpr (CT == CT_List || CT == CT_Deque) { if constexpr (CT == CT_List || CT == CT_Deque) {
PopFront(); // FIXME: Run with forward list as well PopFront(); // FIXME: Run with forward list as well
} }
if constexpr (CT == CT_List || CT == CT_ForwardList) {
RemoveFirstElem();
}
if constexpr (CT == CT_List) {
SpliceFirstElem();
}
} catch (...) { } catch (...) {
assert(false && "uncaught debug exception"); assert(false && "uncaught debug exception");
} }
} }
private: 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() { static void AssignInvalidates() {
CHECKPOINT("assign(Size, Value)"); CHECKPOINT("assign(Size, Value)");
Container C(allocator_type{}); Container C(allocator_type{});

View File

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