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:
parent
6100a9db7d
commit
04505aa466
12
include/list
12
include/list
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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{});
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user