diff --git a/libcxx/docs/Status/Cxx17Papers.csv b/libcxx/docs/Status/Cxx17Papers.csv index 3dd386a8a1ee1..3b56807312d55 100644 --- a/libcxx/docs/Status/Cxx17Papers.csv +++ b/libcxx/docs/Status/Cxx17Papers.csv @@ -81,7 +81,7 @@ "`P0503R0 `__","Correcting library usage of ""literal type""","2016-11 (Issaquah)","|Complete|","4.0","" "`P0504R0 `__","Revisiting in-place tag types for any/optional/variant","2016-11 (Issaquah)","|Complete|","4.0","" "`P0505R0 `__","Wording for GB 50 - constexpr for chrono","2016-11 (Issaquah)","|Complete|","4.0","" -"`P0508R0 `__","Wording for GB 58 - structured bindings for node_handles","2016-11 (Issaquah)","","","" +"`P0508R0 `__","Wording for GB 58 - structured bindings for node_handles","2016-11 (Issaquah)","|Complete|","7.0","" "`P0509R1 `__","Updating ""Restrictions on exception handling""","2016-11 (Issaquah)","|Nothing To Do|","n/a","" "`P0510R0 `__","Disallowing references, incomplete types, arrays, and empty variants","2016-11 (Issaquah)","|Complete|","4.0","" "`P0513R0 `__","Poisoning the Hash","2016-11 (Issaquah)","|Complete|","5.0","" diff --git a/libcxx/test/std/containers/associative/map/map.modifiers/insert_node_type.pass.cpp b/libcxx/test/std/containers/associative/map/map.modifiers/insert_node_type.pass.cpp index 6445cd87858a2..5d910bc3368be 100644 --- a/libcxx/test/std/containers/associative/map/map.modifiers/insert_node_type.pass.cpp +++ b/libcxx/test/std/containers/associative/map/map.modifiers/insert_node_type.pass.cpp @@ -15,10 +15,32 @@ // insert_return_type insert(node_type&&); #include +#include #include #include "test_macros.h" #include "min_allocator.h" +template +void verify_insert_return_type(T&& t) { + using verified_type = std::remove_cv_t>; + static_assert(std::is_aggregate_v); + static_assert(std::is_same_v); + + auto& [pos, ins, nod] = t; + + static_assert(std::is_same_v); + static_assert(std::is_same_v); + assert(std::addressof(pos) == std::addressof(t.position)); + + static_assert(std::is_same_v); + static_assert(std::is_same_v); + assert(&ins == &t.inserted); + + static_assert(std::is_same_v); + static_assert(std::is_same_v); + assert(std::addressof(nod) == std::addressof(t.node)); +} + template typename Container::node_type node_factory(typename Container::key_type const& key, @@ -44,6 +66,7 @@ void test(Container& c) assert(irt.inserted); assert(irt.node.empty()); assert(irt.position->first == i && irt.position->second == i + 1); + verify_insert_return_type(irt); } assert(c.size() == 10); @@ -55,6 +78,7 @@ void test(Container& c) assert(!irt.inserted); assert(irt.node.empty()); assert(irt.position == c.end()); + verify_insert_return_type(irt); } { // Insert duplicate node. @@ -65,6 +89,7 @@ void test(Container& c) assert(!irt.node.empty()); assert(irt.position == c.find(0)); assert(irt.node.key() == 0 && irt.node.mapped() == 42); + verify_insert_return_type(irt); } assert(c.size() == 10); diff --git a/libcxx/test/std/containers/associative/set/insert_node_type.pass.cpp b/libcxx/test/std/containers/associative/set/insert_node_type.pass.cpp index eac48203484b5..69caecffef885 100644 --- a/libcxx/test/std/containers/associative/set/insert_node_type.pass.cpp +++ b/libcxx/test/std/containers/associative/set/insert_node_type.pass.cpp @@ -14,11 +14,33 @@ // insert_return_type insert(node_type&&); +#include #include #include #include "test_macros.h" #include "min_allocator.h" +template +void verify_insert_return_type(T&& t) { + using verified_type = std::remove_cv_t>; + static_assert(std::is_aggregate_v); + static_assert(std::is_same_v); + + auto& [pos, ins, nod] = t; + + static_assert(std::is_same_v); + static_assert(std::is_same_v); + assert(std::addressof(pos) == std::addressof(t.position)); + + static_assert(std::is_same_v); + static_assert(std::is_same_v); + assert(&ins == &t.inserted); + + static_assert(std::is_same_v); + static_assert(std::is_same_v); + assert(std::addressof(nod) == std::addressof(t.node)); +} + template typename Container::node_type node_factory(typename Container::key_type const& key) @@ -43,6 +65,7 @@ void test(Container& c) assert(irt.inserted); assert(irt.node.empty()); assert(*irt.position == i); + verify_insert_return_type(irt); } assert(c.size() == 10); @@ -54,6 +77,7 @@ void test(Container& c) assert(!irt.inserted); assert(irt.node.empty()); assert(irt.position == c.end()); + verify_insert_return_type(irt); } { // Insert duplicate node. @@ -64,6 +88,7 @@ void test(Container& c) assert(!irt.node.empty()); assert(irt.position == c.find(0)); assert(irt.node.value() == 0); + verify_insert_return_type(irt); } assert(c.size() == 10); diff --git a/libcxx/test/std/containers/unord/unord.map/unord.map.modifiers/insert_node_type.pass.cpp b/libcxx/test/std/containers/unord/unord.map/unord.map.modifiers/insert_node_type.pass.cpp index 2d15ee179c23b..7188774466969 100644 --- a/libcxx/test/std/containers/unord/unord.map/unord.map.modifiers/insert_node_type.pass.cpp +++ b/libcxx/test/std/containers/unord/unord.map/unord.map.modifiers/insert_node_type.pass.cpp @@ -14,10 +14,32 @@ // insert_return_type insert(node_type&&); +#include #include #include "test_macros.h" #include "min_allocator.h" +template +void verify_insert_return_type(T&& t) { + using verified_type = std::remove_cv_t>; + static_assert(std::is_aggregate_v); + static_assert(std::is_same_v); + + auto& [pos, ins, nod] = t; + + static_assert(std::is_same_v); + static_assert(std::is_same_v); + assert(std::addressof(pos) == std::addressof(t.position)); + + static_assert(std::is_same_v); + static_assert(std::is_same_v); + assert(&ins == &t.inserted); + + static_assert(std::is_same_v); + static_assert(std::is_same_v); + assert(std::addressof(nod) == std::addressof(t.node)); +} + template typename Container::node_type node_factory(typename Container::key_type const& key, @@ -43,6 +65,7 @@ void test(Container& c) assert(irt.inserted); assert(irt.node.empty()); assert(irt.position->first == i && irt.position->second == i + 1); + verify_insert_return_type(irt); } assert(c.size() == 10); @@ -54,6 +77,7 @@ void test(Container& c) assert(!irt.inserted); assert(irt.node.empty()); assert(irt.position == c.end()); + verify_insert_return_type(irt); } { // Insert duplicate node. @@ -64,6 +88,7 @@ void test(Container& c) assert(!irt.node.empty()); assert(irt.position == c.find(0)); assert(irt.node.key() == 0 && irt.node.mapped() == 42); + verify_insert_return_type(irt); } assert(c.size() == 10); diff --git a/libcxx/test/std/containers/unord/unord.set/insert_node_type.pass.cpp b/libcxx/test/std/containers/unord/unord.set/insert_node_type.pass.cpp index a4ae313d8e301..16f52f456fbff 100644 --- a/libcxx/test/std/containers/unord/unord.set/insert_node_type.pass.cpp +++ b/libcxx/test/std/containers/unord/unord.set/insert_node_type.pass.cpp @@ -14,11 +14,33 @@ // insert_return_type insert(node_type&&); +#include #include #include #include "test_macros.h" #include "min_allocator.h" +template +void verify_insert_return_type(T&& t) { + using verified_type = std::remove_cv_t>; + static_assert(std::is_aggregate_v); + static_assert(std::is_same_v); + + auto& [pos, ins, nod] = t; + + static_assert(std::is_same_v); + static_assert(std::is_same_v); + assert(std::addressof(pos) == std::addressof(t.position)); + + static_assert(std::is_same_v); + static_assert(std::is_same_v); + assert(&ins == &t.inserted); + + static_assert(std::is_same_v); + static_assert(std::is_same_v); + assert(std::addressof(nod) == std::addressof(t.node)); +} + template typename Container::node_type node_factory(typename Container::key_type const& key) @@ -43,6 +65,7 @@ void test(Container& c) assert(irt.inserted); assert(irt.node.empty()); assert(*irt.position == i); + verify_insert_return_type(irt); } assert(c.size() == 10); @@ -54,6 +77,7 @@ void test(Container& c) assert(!irt.inserted); assert(irt.node.empty()); assert(irt.position == c.end()); + verify_insert_return_type(irt); } { // Insert duplicate node. @@ -64,6 +88,7 @@ void test(Container& c) assert(!irt.node.empty()); assert(irt.position == c.find(0)); assert(irt.node.value() == 0); + verify_insert_return_type(irt); } assert(c.size() == 10);