[libcxx-commits] [libcxx] [libc++][test] Fix and refactor exception tests for std::vector (PR #117662)
Peng Liu via libcxx-commits
libcxx-commits at lists.llvm.org
Thu Nov 28 07:17:23 PST 2024
https://github.com/winner245 updated https://github.com/llvm/llvm-project/pull/117662
>From 27d013a503224cffe964556e985ecd44212fa033 Mon Sep 17 00:00:00 2001
From: Peng Liu <winner245 at hotmail.com>
Date: Mon, 25 Nov 2024 22:51:57 -0500
Subject: [PATCH 1/2] Fix and refactor exception tests for std::vector
---
.../std/containers/sequences/vector/common.h | 32 ++++
.../vector/vector.cons/exceptions.pass.cpp | 140 ++++--------------
2 files changed, 62 insertions(+), 110 deletions(-)
diff --git a/libcxx/test/std/containers/sequences/vector/common.h b/libcxx/test/std/containers/sequences/vector/common.h
index e793ab2a21c1d0..81a6609290ac63 100644
--- a/libcxx/test/std/containers/sequences/vector/common.h
+++ b/libcxx/test/std/containers/sequences/vector/common.h
@@ -16,6 +16,38 @@
#include "count_new.h"
+struct throwing_t {
+ int* throw_after_n_ = nullptr;
+ throwing_t() { throw 0; }
+
+ throwing_t(int& throw_after_n) : throw_after_n_(&throw_after_n) {
+ if (throw_after_n == 0)
+ throw 0;
+ --throw_after_n;
+ }
+
+ throwing_t(const throwing_t& rhs) : throw_after_n_(rhs.throw_after_n_) {
+ if (throw_after_n_ == nullptr || *throw_after_n_ == 0)
+ throw 1;
+ --*throw_after_n_;
+ }
+
+ throwing_t& operator=(const throwing_t& rhs) {
+ throw_after_n_ = rhs.throw_after_n_;
+ if (throw_after_n_ == nullptr || *throw_after_n_ == 0)
+ throw 1;
+ --*throw_after_n_;
+ return *this;
+ }
+
+ friend bool operator==(const throwing_t& lhs, const throwing_t& rhs) {
+ return lhs.throw_after_n_ == rhs.throw_after_n_;
+ }
+ friend bool operator!=(const throwing_t& lhs, const throwing_t& rhs) {
+ return lhs.throw_after_n_ != rhs.throw_after_n_;
+ }
+};
+
template <class T>
struct throwing_allocator {
using value_type = T;
diff --git a/libcxx/test/std/containers/sequences/vector/vector.cons/exceptions.pass.cpp b/libcxx/test/std/containers/sequences/vector/vector.cons/exceptions.pass.cpp
index 09355688042f9a..6fa10defecce31 100644
--- a/libcxx/test/std/containers/sequences/vector/vector.cons/exceptions.pass.cpp
+++ b/libcxx/test/std/containers/sequences/vector/vector.cons/exceptions.pass.cpp
@@ -16,98 +16,13 @@
#include <type_traits>
#include <vector>
+#include "../common.h"
#include "count_new.h"
#include "test_allocator.h"
#include "test_iterators.h"
-template <class T>
-struct Allocator {
- using value_type = T;
- using is_always_equal = std::false_type;
-
- template <class U>
- Allocator(const Allocator<U>&) {}
-
- Allocator(bool should_throw = true) {
- if (should_throw)
- throw 0;
- }
-
- T* allocate(std::size_t n) { return std::allocator<T>().allocate(n); }
- void deallocate(T* ptr, std::size_t n) { std::allocator<T>().deallocate(ptr, n); }
-
- template <class U>
- friend bool operator==(const Allocator&, const Allocator<U>&) {
- return true;
- }
-};
-
-struct ThrowingT {
- int* throw_after_n_ = nullptr;
- ThrowingT() { throw 0; }
-
- ThrowingT(int& throw_after_n) : throw_after_n_(&throw_after_n) {
- if (throw_after_n == 0)
- throw 0;
- --throw_after_n;
- }
-
- ThrowingT(const ThrowingT& rhs) : throw_after_n_(rhs.throw_after_n_) {
- if (throw_after_n_ == nullptr || *throw_after_n_ == 0)
- throw 1;
- --*throw_after_n_;
- }
-
- ThrowingT& operator=(const ThrowingT& rhs) {
- throw_after_n_ = rhs.throw_after_n_;
- if (throw_after_n_ == nullptr || *throw_after_n_ == 0)
- throw 1;
- --*throw_after_n_;
- return *this;
- }
-};
-
-template <class IterCat>
-struct Iterator {
- using iterator_category = IterCat;
- using difference_type = std::ptrdiff_t;
- using value_type = int;
- using reference = int&;
- using pointer = int*;
-
- int i_;
- Iterator(int i = 0) : i_(i) {}
- int& operator*() {
- if (i_ == 1)
- throw 1;
- return i_;
- }
-
- friend bool operator==(const Iterator& lhs, const Iterator& rhs) { return lhs.i_ == rhs.i_; }
-
- friend bool operator!=(const Iterator& lhs, const Iterator& rhs) { return lhs.i_ != rhs.i_; }
-
- Iterator& operator++() {
- ++i_;
- return *this;
- }
-
- Iterator operator++(int) {
- auto tmp = *this;
- ++i_;
- return tmp;
- }
-};
-
-void check_new_delete_called() {
- assert(globalMemCounter.new_called == globalMemCounter.delete_called);
- assert(globalMemCounter.new_array_called == globalMemCounter.delete_array_called);
- assert(globalMemCounter.aligned_new_called == globalMemCounter.aligned_delete_called);
- assert(globalMemCounter.aligned_new_array_called == globalMemCounter.aligned_delete_array_called);
-}
-
int main(int, char**) {
- using AllocVec = std::vector<int, Allocator<int> >;
+ using AllocVec = std::vector<int, throwing_allocator<int> >;
try { // vector()
AllocVec vec;
} catch (int) {
@@ -115,7 +30,7 @@ int main(int, char**) {
check_new_delete_called();
try { // Throw in vector(size_type) from type
- std::vector<ThrowingT> get_alloc(1);
+ std::vector<throwing_t> get_alloc(1);
} catch (int) {
}
check_new_delete_called();
@@ -123,21 +38,21 @@ int main(int, char**) {
#if TEST_STD_VER >= 14
try { // Throw in vector(size_type, value_type) from type
int throw_after = 1;
- ThrowingT v(throw_after);
- std::vector<ThrowingT> get_alloc(1, v);
+ throwing_t v(throw_after);
+ std::vector<throwing_t> get_alloc(1, v);
} catch (int) {
}
check_new_delete_called();
- try { // Throw in vector(size_type, const allocator_type&) from allocator
- Allocator<int> alloc(false);
+ try { // Throw in vector(size_type, const allocator_type&) from allocator
+ throwing_allocator<int> alloc(false, true); // throw on copy only
AllocVec get_alloc(0, alloc);
} catch (int) {
}
check_new_delete_called();
try { // Throw in vector(size_type, const allocator_type&) from the type
- std::vector<ThrowingT> vec(1, std::allocator<ThrowingT>());
+ std::vector<throwing_t> vec(1, std::allocator<throwing_t>());
} catch (int) {
}
check_new_delete_called();
@@ -145,20 +60,22 @@ int main(int, char**) {
try { // Throw in vector(size_type, value_type, const allocator_type&) from the type
int throw_after = 1;
- ThrowingT v(throw_after);
- std::vector<ThrowingT> vec(1, v, std::allocator<ThrowingT>());
+ throwing_t v(throw_after);
+ std::vector<throwing_t> vec(1, v, std::allocator<throwing_t>());
} catch (int) {
}
check_new_delete_called();
try { // Throw in vector(InputIterator, InputIterator) from input iterator
- std::vector<int> vec((Iterator<std::input_iterator_tag>()), Iterator<std::input_iterator_tag>(2));
+ std::vector<int> vec(
+ (throwing_iterator<int, std::input_iterator_tag>()), throwing_iterator<int, std::input_iterator_tag>(2));
} catch (int) {
}
check_new_delete_called();
try { // Throw in vector(InputIterator, InputIterator) from forward iterator
- std::vector<int> vec((Iterator<std::forward_iterator_tag>()), Iterator<std::forward_iterator_tag>(2));
+ std::vector<int> vec(
+ (throwing_iterator<int, std::forward_iterator_tag>()), throwing_iterator<int, std::forward_iterator_tag>(2));
} catch (int) {
}
check_new_delete_called();
@@ -172,21 +89,24 @@ int main(int, char**) {
try { // Throw in vector(InputIterator, InputIterator, const allocator_type&) from input iterator
std::allocator<int> alloc;
- std::vector<int> vec(Iterator<std::input_iterator_tag>(), Iterator<std::input_iterator_tag>(2), alloc);
+ std::vector<int> vec(
+ throwing_iterator<int, std::input_iterator_tag>(), throwing_iterator<int, std::input_iterator_tag>(2), alloc);
} catch (int) {
}
check_new_delete_called();
try { // Throw in vector(InputIterator, InputIterator, const allocator_type&) from forward iterator
std::allocator<int> alloc;
- std::vector<int> vec(Iterator<std::forward_iterator_tag>(), Iterator<std::forward_iterator_tag>(2), alloc);
+ std::vector<int> vec(throwing_iterator<int, std::forward_iterator_tag>(),
+ throwing_iterator<int, std::forward_iterator_tag>(2),
+ alloc);
} catch (int) {
}
check_new_delete_called();
try { // Throw in vector(InputIterator, InputIterator, const allocator_type&) from allocator
int a[] = {1, 2};
- Allocator<int> alloc(false);
+ throwing_allocator<int> alloc(false, true); // throw on copy only
AllocVec vec(cpp17_input_iterator<int*>(a), cpp17_input_iterator<int*>(a + 2), alloc);
} catch (int) {
// FIXME: never called.
@@ -195,7 +115,7 @@ int main(int, char**) {
try { // Throw in vector(InputIterator, InputIterator, const allocator_type&) from allocator
int a[] = {1, 2};
- Allocator<int> alloc(false);
+ throwing_allocator<int> alloc(false, true); // throw on copy only
AllocVec vec(forward_iterator<int*>(a), forward_iterator<int*>(a + 2), alloc);
} catch (int) {
// FIXME: never called.
@@ -203,8 +123,8 @@ int main(int, char**) {
check_new_delete_called();
try { // Throw in vector(const vector&) from type
- std::vector<ThrowingT> vec;
- int throw_after = 0;
+ std::vector<throwing_t> vec;
+ int throw_after = 1;
vec.emplace_back(throw_after);
auto vec2 = vec;
} catch (int) {
@@ -212,20 +132,20 @@ int main(int, char**) {
check_new_delete_called();
try { // Throw in vector(const vector&, const allocator_type&) from type
- std::vector<ThrowingT> vec;
+ std::vector<throwing_t> vec;
int throw_after = 1;
vec.emplace_back(throw_after);
- std::vector<ThrowingT> vec2(vec, std::allocator<int>());
+ std::vector<throwing_t> vec2(vec, std::allocator<int>());
} catch (int) {
}
check_new_delete_called();
try { // Throw in vector(vector&&, const allocator_type&) from type during element-wise move
- std::vector<ThrowingT, test_allocator<ThrowingT> > vec(test_allocator<ThrowingT>(1));
+ std::vector<throwing_t, test_allocator<throwing_t> > vec(test_allocator<throwing_t>(1));
int throw_after = 10;
- ThrowingT v(throw_after);
+ throwing_t v(throw_after);
vec.insert(vec.end(), 6, v);
- std::vector<ThrowingT, test_allocator<ThrowingT> > vec2(std::move(vec), test_allocator<ThrowingT>(2));
+ std::vector<throwing_t, test_allocator<throwing_t> > vec2(std::move(vec), test_allocator<throwing_t>(2));
} catch (int) {
}
check_new_delete_called();
@@ -233,14 +153,14 @@ int main(int, char**) {
#if TEST_STD_VER >= 11
try { // Throw in vector(initializer_list<value_type>) from type
int throw_after = 1;
- std::vector<ThrowingT> vec({ThrowingT(throw_after)});
+ std::vector<throwing_t> vec({throwing_t(throw_after)});
} catch (int) {
}
check_new_delete_called();
try { // Throw in vector(initializer_list<value_type>, const allocator_type&) constructor from type
int throw_after = 1;
- std::vector<ThrowingT> vec({ThrowingT(throw_after)}, std::allocator<ThrowingT>());
+ std::vector<throwing_t> vec({throwing_t(throw_after)}, std::allocator<throwing_t>());
} catch (int) {
}
check_new_delete_called();
>From 7229b2edee99c7614768df3282de784fc01a49a9 Mon Sep 17 00:00:00 2001
From: Peng Liu <winner245 at hotmail.com>
Date: Thu, 28 Nov 2024 10:07:41 -0500
Subject: [PATCH 2/2] Refactor
---
libcxx/test/std/containers/sequences/vector/common.h | 1 -
.../sequences/vector/vector.cons/exceptions.pass.cpp | 8 ++++----
2 files changed, 4 insertions(+), 5 deletions(-)
diff --git a/libcxx/test/std/containers/sequences/vector/common.h b/libcxx/test/std/containers/sequences/vector/common.h
index 81a6609290ac63..7c7df958856ef0 100644
--- a/libcxx/test/std/containers/sequences/vector/common.h
+++ b/libcxx/test/std/containers/sequences/vector/common.h
@@ -51,7 +51,6 @@ struct throwing_t {
template <class T>
struct throwing_allocator {
using value_type = T;
- using is_always_equal = std::false_type;
bool throw_on_copy_ = false;
diff --git a/libcxx/test/std/containers/sequences/vector/vector.cons/exceptions.pass.cpp b/libcxx/test/std/containers/sequences/vector/vector.cons/exceptions.pass.cpp
index 6fa10defecce31..f9c45ab3d4c9e1 100644
--- a/libcxx/test/std/containers/sequences/vector/vector.cons/exceptions.pass.cpp
+++ b/libcxx/test/std/containers/sequences/vector/vector.cons/exceptions.pass.cpp
@@ -44,8 +44,8 @@ int main(int, char**) {
}
check_new_delete_called();
- try { // Throw in vector(size_type, const allocator_type&) from allocator
- throwing_allocator<int> alloc(false, true); // throw on copy only
+ try { // Throw in vector(size_type, const allocator_type&) from allocator
+ throwing_allocator<int> alloc(/*throw_on_ctor = */ false, /*throw_on_copy = */ true);
AllocVec get_alloc(0, alloc);
} catch (int) {
}
@@ -106,7 +106,7 @@ int main(int, char**) {
try { // Throw in vector(InputIterator, InputIterator, const allocator_type&) from allocator
int a[] = {1, 2};
- throwing_allocator<int> alloc(false, true); // throw on copy only
+ throwing_allocator<int> alloc(/*throw_on_ctor = */ false, /*throw_on_copy = */ true);
AllocVec vec(cpp17_input_iterator<int*>(a), cpp17_input_iterator<int*>(a + 2), alloc);
} catch (int) {
// FIXME: never called.
@@ -115,7 +115,7 @@ int main(int, char**) {
try { // Throw in vector(InputIterator, InputIterator, const allocator_type&) from allocator
int a[] = {1, 2};
- throwing_allocator<int> alloc(false, true); // throw on copy only
+ throwing_allocator<int> alloc(/*throw_on_ctor = */ false, /*throw_on_copy = */ true);
AllocVec vec(forward_iterator<int*>(a), forward_iterator<int*>(a + 2), alloc);
} catch (int) {
// FIXME: never called.
More information about the libcxx-commits
mailing list