Skip to content

Commit 2d13302

Browse files
[libc++][test] Confirm that P0508R0 has been implemented (#108172)
The paper was implemented by commit b0386a5 (https://reviews.llvm.org/D46845) in LLVM 7.0. But it would be nice to have test coverage for desired properties of `insert_return_type`. Closes #99944
1 parent 397e4dc commit 2d13302

File tree

5 files changed

+101
-1
lines changed

5 files changed

+101
-1
lines changed

libcxx/docs/Status/Cxx17Papers.csv

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@
8181
"`P0503R0 <https://wg21.link/P0503R0>`__","Correcting library usage of ""literal type""","2016-11 (Issaquah)","|Complete|","4.0",""
8282
"`P0504R0 <https://wg21.link/P0504R0>`__","Revisiting in-place tag types for any/optional/variant","2016-11 (Issaquah)","|Complete|","4.0",""
8383
"`P0505R0 <https://wg21.link/P0505R0>`__","Wording for GB 50 - constexpr for chrono","2016-11 (Issaquah)","|Complete|","4.0",""
84-
"`P0508R0 <https://wg21.link/P0508R0>`__","Wording for GB 58 - structured bindings for node_handles","2016-11 (Issaquah)","","",""
84+
"`P0508R0 <https://wg21.link/P0508R0>`__","Wording for GB 58 - structured bindings for node_handles","2016-11 (Issaquah)","|Complete|","7.0",""
8585
"`P0509R1 <https://wg21.link/P0509R1>`__","Updating ""Restrictions on exception handling""","2016-11 (Issaquah)","|Nothing To Do|","n/a",""
8686
"`P0510R0 <https://wg21.link/P0510R0>`__","Disallowing references, incomplete types, arrays, and empty variants","2016-11 (Issaquah)","|Complete|","4.0",""
8787
"`P0513R0 <https://wg21.link/P0513R0>`__","Poisoning the Hash","2016-11 (Issaquah)","|Complete|","5.0",""

libcxx/test/std/containers/associative/map/map.modifiers/insert_node_type.pass.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,32 @@
1515
// insert_return_type insert(node_type&&);
1616

1717
#include <map>
18+
#include <memory>
1819
#include <type_traits>
1920
#include "test_macros.h"
2021
#include "min_allocator.h"
2122

23+
template <class Container, class T>
24+
void verify_insert_return_type(T&& t) {
25+
using verified_type = std::remove_cv_t<std::remove_reference_t<T>>;
26+
static_assert(std::is_aggregate_v<verified_type>);
27+
static_assert(std::is_same_v<verified_type, typename Container::insert_return_type>);
28+
29+
auto& [pos, ins, nod] = t;
30+
31+
static_assert(std::is_same_v<decltype(pos), typename Container::iterator>);
32+
static_assert(std::is_same_v<decltype(t.position), typename Container::iterator>);
33+
assert(std::addressof(pos) == std::addressof(t.position));
34+
35+
static_assert(std::is_same_v<decltype(ins), bool>);
36+
static_assert(std::is_same_v<decltype(t.inserted), bool>);
37+
assert(&ins == &t.inserted);
38+
39+
static_assert(std::is_same_v<decltype(nod), typename Container::node_type>);
40+
static_assert(std::is_same_v<decltype(t.node), typename Container::node_type>);
41+
assert(std::addressof(nod) == std::addressof(t.node));
42+
}
43+
2244
template <class Container>
2345
typename Container::node_type
2446
node_factory(typename Container::key_type const& key,
@@ -44,6 +66,7 @@ void test(Container& c)
4466
assert(irt.inserted);
4567
assert(irt.node.empty());
4668
assert(irt.position->first == i && irt.position->second == i + 1);
69+
verify_insert_return_type<Container>(irt);
4770
}
4871

4972
assert(c.size() == 10);
@@ -55,6 +78,7 @@ void test(Container& c)
5578
assert(!irt.inserted);
5679
assert(irt.node.empty());
5780
assert(irt.position == c.end());
81+
verify_insert_return_type<Container>(irt);
5882
}
5983

6084
{ // Insert duplicate node.
@@ -65,6 +89,7 @@ void test(Container& c)
6589
assert(!irt.node.empty());
6690
assert(irt.position == c.find(0));
6791
assert(irt.node.key() == 0 && irt.node.mapped() == 42);
92+
verify_insert_return_type<Container>(irt);
6893
}
6994

7095
assert(c.size() == 10);

libcxx/test/std/containers/associative/set/insert_node_type.pass.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,33 @@
1414

1515
// insert_return_type insert(node_type&&);
1616

17+
#include <memory>
1718
#include <set>
1819
#include <type_traits>
1920
#include "test_macros.h"
2021
#include "min_allocator.h"
2122

23+
template <class Container, class T>
24+
void verify_insert_return_type(T&& t) {
25+
using verified_type = std::remove_cv_t<std::remove_reference_t<T>>;
26+
static_assert(std::is_aggregate_v<verified_type>);
27+
static_assert(std::is_same_v<verified_type, typename Container::insert_return_type>);
28+
29+
auto& [pos, ins, nod] = t;
30+
31+
static_assert(std::is_same_v<decltype(pos), typename Container::iterator>);
32+
static_assert(std::is_same_v<decltype(t.position), typename Container::iterator>);
33+
assert(std::addressof(pos) == std::addressof(t.position));
34+
35+
static_assert(std::is_same_v<decltype(ins), bool>);
36+
static_assert(std::is_same_v<decltype(t.inserted), bool>);
37+
assert(&ins == &t.inserted);
38+
39+
static_assert(std::is_same_v<decltype(nod), typename Container::node_type>);
40+
static_assert(std::is_same_v<decltype(t.node), typename Container::node_type>);
41+
assert(std::addressof(nod) == std::addressof(t.node));
42+
}
43+
2244
template <class Container>
2345
typename Container::node_type
2446
node_factory(typename Container::key_type const& key)
@@ -43,6 +65,7 @@ void test(Container& c)
4365
assert(irt.inserted);
4466
assert(irt.node.empty());
4567
assert(*irt.position == i);
68+
verify_insert_return_type<Container>(irt);
4669
}
4770

4871
assert(c.size() == 10);
@@ -54,6 +77,7 @@ void test(Container& c)
5477
assert(!irt.inserted);
5578
assert(irt.node.empty());
5679
assert(irt.position == c.end());
80+
verify_insert_return_type<Container>(irt);
5781
}
5882

5983
{ // Insert duplicate node.
@@ -64,6 +88,7 @@ void test(Container& c)
6488
assert(!irt.node.empty());
6589
assert(irt.position == c.find(0));
6690
assert(irt.node.value() == 0);
91+
verify_insert_return_type<Container>(irt);
6792
}
6893

6994
assert(c.size() == 10);

libcxx/test/std/containers/unord/unord.map/unord.map.modifiers/insert_node_type.pass.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,32 @@
1414

1515
// insert_return_type insert(node_type&&);
1616

17+
#include <memory>
1718
#include <unordered_map>
1819
#include "test_macros.h"
1920
#include "min_allocator.h"
2021

22+
template <class Container, class T>
23+
void verify_insert_return_type(T&& t) {
24+
using verified_type = std::remove_cv_t<std::remove_reference_t<T>>;
25+
static_assert(std::is_aggregate_v<verified_type>);
26+
static_assert(std::is_same_v<verified_type, typename Container::insert_return_type>);
27+
28+
auto& [pos, ins, nod] = t;
29+
30+
static_assert(std::is_same_v<decltype(pos), typename Container::iterator>);
31+
static_assert(std::is_same_v<decltype(t.position), typename Container::iterator>);
32+
assert(std::addressof(pos) == std::addressof(t.position));
33+
34+
static_assert(std::is_same_v<decltype(ins), bool>);
35+
static_assert(std::is_same_v<decltype(t.inserted), bool>);
36+
assert(&ins == &t.inserted);
37+
38+
static_assert(std::is_same_v<decltype(nod), typename Container::node_type>);
39+
static_assert(std::is_same_v<decltype(t.node), typename Container::node_type>);
40+
assert(std::addressof(nod) == std::addressof(t.node));
41+
}
42+
2143
template <class Container>
2244
typename Container::node_type
2345
node_factory(typename Container::key_type const& key,
@@ -43,6 +65,7 @@ void test(Container& c)
4365
assert(irt.inserted);
4466
assert(irt.node.empty());
4567
assert(irt.position->first == i && irt.position->second == i + 1);
68+
verify_insert_return_type<Container>(irt);
4669
}
4770

4871
assert(c.size() == 10);
@@ -54,6 +77,7 @@ void test(Container& c)
5477
assert(!irt.inserted);
5578
assert(irt.node.empty());
5679
assert(irt.position == c.end());
80+
verify_insert_return_type<Container>(irt);
5781
}
5882

5983
{ // Insert duplicate node.
@@ -64,6 +88,7 @@ void test(Container& c)
6488
assert(!irt.node.empty());
6589
assert(irt.position == c.find(0));
6690
assert(irt.node.key() == 0 && irt.node.mapped() == 42);
91+
verify_insert_return_type<Container>(irt);
6792
}
6893

6994
assert(c.size() == 10);

libcxx/test/std/containers/unord/unord.set/insert_node_type.pass.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,33 @@
1414

1515
// insert_return_type insert(node_type&&);
1616

17+
#include <memory>
1718
#include <unordered_set>
1819
#include <type_traits>
1920
#include "test_macros.h"
2021
#include "min_allocator.h"
2122

23+
template <class Container, class T>
24+
void verify_insert_return_type(T&& t) {
25+
using verified_type = std::remove_cv_t<std::remove_reference_t<T>>;
26+
static_assert(std::is_aggregate_v<verified_type>);
27+
static_assert(std::is_same_v<verified_type, typename Container::insert_return_type>);
28+
29+
auto& [pos, ins, nod] = t;
30+
31+
static_assert(std::is_same_v<decltype(pos), typename Container::iterator>);
32+
static_assert(std::is_same_v<decltype(t.position), typename Container::iterator>);
33+
assert(std::addressof(pos) == std::addressof(t.position));
34+
35+
static_assert(std::is_same_v<decltype(ins), bool>);
36+
static_assert(std::is_same_v<decltype(t.inserted), bool>);
37+
assert(&ins == &t.inserted);
38+
39+
static_assert(std::is_same_v<decltype(nod), typename Container::node_type>);
40+
static_assert(std::is_same_v<decltype(t.node), typename Container::node_type>);
41+
assert(std::addressof(nod) == std::addressof(t.node));
42+
}
43+
2244
template <class Container>
2345
typename Container::node_type
2446
node_factory(typename Container::key_type const& key)
@@ -43,6 +65,7 @@ void test(Container& c)
4365
assert(irt.inserted);
4466
assert(irt.node.empty());
4567
assert(*irt.position == i);
68+
verify_insert_return_type<Container>(irt);
4669
}
4770

4871
assert(c.size() == 10);
@@ -54,6 +77,7 @@ void test(Container& c)
5477
assert(!irt.inserted);
5578
assert(irt.node.empty());
5679
assert(irt.position == c.end());
80+
verify_insert_return_type<Container>(irt);
5781
}
5882

5983
{ // Insert duplicate node.
@@ -64,6 +88,7 @@ void test(Container& c)
6488
assert(!irt.node.empty());
6589
assert(irt.position == c.find(0));
6690
assert(irt.node.value() == 0);
91+
verify_insert_return_type<Container>(irt);
6792
}
6893

6994
assert(c.size() == 10);

0 commit comments

Comments
 (0)