[libcxx-commits] [libcxx] [libc++][test] Make `EvilContainer` a sequence container (PR #178626)
A. Jiang via libcxx-commits
libcxx-commits at lists.llvm.org
Thu Jan 29 02:31:05 PST 2026
https://github.com/frederick-vs-ja created https://github.com/llvm/llvm-project/pull/178626
In tests for flat container adaptors, the `EvilContainer` type doesn't have sufficient constructors to meet the requirements for sequence containers ([sequence.reqmts]). Also, assignment from an `initializer_list` doesn't have correct return type.
This patch makes `EvilContainer` inherit constructors from `vector<int>` and add a correct assignment operator from `initializer_list<int>`.
Fixes #178624.
>From ad70a2891a8f87138011fc956b9e358b97ffc427 Mon Sep 17 00:00:00 2001
From: "A. Jiang" <de34 at live.cn>
Date: Thu, 29 Jan 2026 18:28:56 +0800
Subject: [PATCH] [libc++][test] Make `EvilContainer` a sequence container
In tests for flat container adaptors, the `EvilContainer` type doesn't
have sufficient constructors to meet the requirements for
sequence containers (sequence.reqmts). Also, assignment from an
`initializer_list` doesn't have correct return type.
This patch make `EvilContainer` inherit constructors from `vector<int>`
and add a correct assignment operator from `initializer_list<int>`.
---
.../flat.map/flat.map.cons/move_exceptions.pass.cpp | 7 +++++++
.../flat.multimap.cons/move_exceptions.pass.cpp | 7 +++++++
.../flat.multiset/flat.multiset.cons/move.pass.cpp | 7 +++++++
.../flat.set/flat.set.cons/move.pass.cpp | 7 +++++++
4 files changed, 28 insertions(+)
diff --git a/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.cons/move_exceptions.pass.cpp b/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.cons/move_exceptions.pass.cpp
index cb7e30c2b74fa..e56cb12d9a113 100644
--- a/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.cons/move_exceptions.pass.cpp
+++ b/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.cons/move_exceptions.pass.cpp
@@ -27,6 +27,8 @@
static int countdown = 0;
struct EvilContainer : std::vector<int> {
+ using std::vector<int>::vector;
+
EvilContainer() = default;
EvilContainer(EvilContainer&& rhs) {
// Throw on move-construction.
@@ -36,6 +38,11 @@ struct EvilContainer : std::vector<int> {
throw 42;
}
}
+
+ EvilContainer& operator=(std::initializer_list<int> il) {
+ std::vector<int>::operator=(il);
+ return *this;
+ }
};
int main(int, char**) {
diff --git a/libcxx/test/std/containers/container.adaptors/flat.multimap/flat.multimap.cons/move_exceptions.pass.cpp b/libcxx/test/std/containers/container.adaptors/flat.multimap/flat.multimap.cons/move_exceptions.pass.cpp
index c2085e32be532..44b6e93114c78 100644
--- a/libcxx/test/std/containers/container.adaptors/flat.multimap/flat.multimap.cons/move_exceptions.pass.cpp
+++ b/libcxx/test/std/containers/container.adaptors/flat.multimap/flat.multimap.cons/move_exceptions.pass.cpp
@@ -27,6 +27,8 @@
static int countdown = 0;
struct EvilContainer : std::vector<int> {
+ using std::vector<int>::vector;
+
EvilContainer() = default;
EvilContainer(EvilContainer&& rhs) {
// Throw on move-construction.
@@ -36,6 +38,11 @@ struct EvilContainer : std::vector<int> {
throw 42;
}
}
+
+ EvilContainer& operator=(std::initializer_list<int> il) {
+ std::vector<int>::operator=(il);
+ return *this;
+ }
};
int main(int, char**) {
diff --git a/libcxx/test/std/containers/container.adaptors/flat.multiset/flat.multiset.cons/move.pass.cpp b/libcxx/test/std/containers/container.adaptors/flat.multiset/flat.multiset.cons/move.pass.cpp
index 064baa98d2b51..f9fea737254d3 100644
--- a/libcxx/test/std/containers/container.adaptors/flat.multiset/flat.multiset.cons/move.pass.cpp
+++ b/libcxx/test/std/containers/container.adaptors/flat.multiset/flat.multiset.cons/move.pass.cpp
@@ -159,6 +159,8 @@ void test_move_noexcept() {
static int countdown = 0;
struct EvilContainer : std::vector<int> {
+ using std::vector<int>::vector;
+
EvilContainer() = default;
EvilContainer(EvilContainer&& rhs) {
// Throw on move-construction.
@@ -168,6 +170,11 @@ struct EvilContainer : std::vector<int> {
throw 42;
}
}
+
+ EvilContainer& operator=(std::initializer_list<int> il) {
+ std::vector<int>::operator=(il);
+ return *this;
+ }
};
void test_move_exception() {
diff --git a/libcxx/test/std/containers/container.adaptors/flat.set/flat.set.cons/move.pass.cpp b/libcxx/test/std/containers/container.adaptors/flat.set/flat.set.cons/move.pass.cpp
index b737a5fba056d..1d7a3589cc109 100644
--- a/libcxx/test/std/containers/container.adaptors/flat.set/flat.set.cons/move.pass.cpp
+++ b/libcxx/test/std/containers/container.adaptors/flat.set/flat.set.cons/move.pass.cpp
@@ -150,6 +150,8 @@ constexpr bool test() {
static int countdown = 0;
struct EvilContainer : std::vector<int> {
+ using std::vector<int>::vector;
+
EvilContainer() = default;
EvilContainer(EvilContainer&& rhs) {
// Throw on move-construction.
@@ -159,6 +161,11 @@ struct EvilContainer : std::vector<int> {
throw 42;
}
}
+
+ EvilContainer& operator=(std::initializer_list<int> il) {
+ std::vector<int>::operator=(il);
+ return *this;
+ }
};
void test_move_exception() {
More information about the libcxx-commits
mailing list