diff --git a/libstdc++-v3/testsuite/util/exception/safety.h b/libstdc++-v3/testsuite/util/exception/safety.h index 16a784e4908..2e5d8acae00 100644 --- a/libstdc++-v3/testsuite/util/exception/safety.h +++ b/libstdc++-v3/testsuite/util/exception/safety.h @@ -43,12 +43,12 @@ namespace __gnu_test { // A single seed value is much smaller than the mt19937 state size, // but we're not trying to be cryptographically secure here. - unsigned s = std::atoi(v); + int s = std::atoi(v); if (s == 0) - s = std::random_device{}(); - std::printf("Using random seed %u\n", s); + s = (int)std::random_device{}(); + std::printf("Using random seed %d\n", s); std::fflush(stdout); - engine.seed(s); + engine.seed((unsigned)s); } return engine; } @@ -318,10 +318,13 @@ namespace __gnu_test // computed with begin() and end(). const size_type sz = std::distance(__container.begin(), __container.end()); + // Container::erase(pos) requires dereferenceable pos. + if (sz == 0) + throw std::logic_error("erase_point: empty container"); // NB: Lowest common denominator: use forward iterator operations. auto i = __container.begin(); - std::advance(i, generate(sz)); + std::advance(i, generate(sz - 1)); // Makes it easier to think of this as __container.erase(i) (__container.*_F_erase_point)(i); @@ -346,12 +349,15 @@ namespace __gnu_test // computed with begin() and end(). const size_type sz = std::distance(__container.begin(), __container.end()); + // forward_list::erase_after(pos) requires dereferenceable pos. + if (sz == 0) + throw std::logic_error("erase_point: empty container"); // NB: Lowest common denominator: use forward iterator operations. auto i = __container.before_begin(); - std::advance(i, generate(sz)); + std::advance(i, generate(sz - 1)); - // Makes it easier to think of this as __container.erase(i) + // Makes it easier to think of this as __container.erase_after(i) (__container.*_F_erase_point)(i); } catch(const __gnu_cxx::forced_error&) @@ -414,14 +420,19 @@ namespace __gnu_test { const size_type sz = std::distance(__container.begin(), __container.end()); - size_type s1 = generate(sz); - size_type s2 = generate(sz); + // forward_list::erase_after(pos, last) requires a pos != last + if (sz == 0) + return; // Caller doesn't check for this, not a logic error. + + size_type s1 = generate(sz - 1); + size_type s2 = generate(sz - 1); auto i1 = __container.before_begin(); auto i2 = __container.before_begin(); std::advance(i1, std::min(s1, s2)); - std::advance(i2, std::max(s1, s2)); + std::advance(i2, std::max(s1, s2) + 1); - // Makes it easier to think of this as __container.erase(i1, i2). + // Makes it easier to think of this as + // __container.erase_after(i1, i2). (__container.*_F_erase_range)(i1, i2); } catch(const __gnu_cxx::forced_error&) @@ -1463,16 +1474,25 @@ namespace __gnu_test // constructor or assignment operator of value_type throws. if (!traits::has_throwing_erase::value) { - typename base_type::erase_point erasep; - erasep(container); + if (!container.empty()) + { + typename base_type::erase_point erasep; + erasep(container); + } typename base_type::erase_range eraser; eraser(container); } - typename base_type::pop_front popf; - popf(container); - typename base_type::pop_back popb; - popb(container); + if (!container.empty()) + { + typename base_type::pop_front popf; + popf(container); + } + if (!container.empty()) + { + typename base_type::pop_back popb; + popb(container); + } typename base_type::iterator_ops iops; iops(container); diff --git a/libstdc++-v3/testsuite/util/testsuite_containergen.h b/libstdc++-v3/testsuite/util/testsuite_containergen.h index 5bbe620d59d..c468c7f4415 100644 --- a/libstdc++-v3/testsuite/util/testsuite_containergen.h +++ b/libstdc++-v3/testsuite/util/testsuite_containergen.h @@ -69,12 +69,12 @@ namespace __gnu_test { // A single seed value is much smaller than the mt19937 state size, // but we're not trying to be cryptographically secure here. - unsigned s = std::atoi(v); + int s = std::atoi(v); if (s == 0) - s = std::random_device{}(); - std::printf("Using random seed %u\n", s); + s = (int)std::random_device{}(); + std::printf("Using random seed %d\n", s); std::fflush(stdout); - random_gen.seed(s); + random_gen.seed((unsigned)s); } #ifdef SIMULATOR_TEST