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
|
||||
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
|
||||
|
@ -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;
|
||||
|
@ -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{});
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user