From 3e653d6c9b2a0e7dfbb25bfeb1bb81ca9ef8a60f Mon Sep 17 00:00:00 2001 From: Marshall Clow Date: Wed, 3 Jan 2018 04:37:30 +0000 Subject: Mark LWG2824 as complete. We already did it, but I added a test to be sure git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@321689 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../sequences/list/list.ops/sort_comp.pass.cpp | 41 ++++++++++++++++++++++ www/cxx1z_status.html | 4 +-- 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/test/std/containers/sequences/list/list.ops/sort_comp.pass.cpp b/test/std/containers/sequences/list/list.ops/sort_comp.pass.cpp index 517eb62cc..c8966f6fc 100644 --- a/test/std/containers/sequences/list/list.ops/sort_comp.pass.cpp +++ b/test/std/containers/sequences/list/list.ops/sort_comp.pass.cpp @@ -13,10 +13,29 @@ #include #include +#include // for is_permutation #include #include "min_allocator.h" + +#ifndef TEST_HAS_NO_EXCEPTIONS +template +struct throwingLess { + throwingLess() : num_(1) {} + throwingLess(int num) : num_(num) {} + + bool operator() (const T& lhs, const T& rhs) const + { + if ( --num_ == 0) throw 1; + return lhs < rhs; + } + + mutable int num_; + }; +#endif + + int main() { { @@ -26,6 +45,28 @@ int main() c1.sort(std::greater()); assert(c1 == std::list(a2, a2+sizeof(a2)/sizeof(a2[0]))); } + +// Test with throwing comparison; make sure that nothing is lost. +// This is (sort of) LWG #2824 +#ifndef TEST_HAS_NO_EXCEPTIONS + { + int a1[] = {4, 8, 1, 0, 5, 7, 2, 3, 6, 11, 10, 9}; + const int sz = sizeof(a1)/sizeof(a1[0]); + for (int i = 0; i < 10; ++i) + { + std::list c1(a1, a1 + sz); + try + { + throwingLess comp(i); + c1.sort(std::cref(comp)); + } + catch (int) {} + assert((c1.size() == sz)); + assert((std::is_permutation(c1.begin(), c1.end(), a1))); + } + } +#endif + #if TEST_STD_VER >= 11 { int a1[] = {4, 8, 1, 0, 5, 7, 2, 3, 6, 11, 10, 9}; diff --git a/www/cxx1z_status.html b/www/cxx1z_status.html index deceef99a..82f7fa519 100644 --- a/www/cxx1z_status.html +++ b/www/cxx1z_status.html @@ -454,7 +454,7 @@ 2788basic_string range mutators unintentionally require a default constructible allocatorKonaComplete 2789Equivalence of contained objectsKonaComplete 2790Missing specification of istreambuf_iterator::operator->KonaComplete - 2794Missing requirements for allocator pointersKona + 2794Missing requirements for allocator pointersKonaNothing to do 2795§[global.functions] provides incorrect example of ADL useKonaComplete 2796tuple should be a literal typeKonaComplete 2801Default-constructibility of unique_ptrKonaComplete @@ -463,7 +463,7 @@ 2806Base class of bad_optional_accessKonaComplete 2807std::invoke should use std::is_nothrow_callableKona 2812Range access is available with <string_view>KonaComplete - 2824list::sort should say that the order of elements is unspecified if an exception is thrownKona + 2824list::sort should say that the order of elements is unspecified if an exception is thrownKonaComplete 2826string_view iterators use old wordingKonaComplete 2834Resolution LWG 2223 is missing wording about end iteratorsKonaComplete 2835LWG 2536 seems to misspecify <tgmath.h>Kona -- cgit v1.2.3