From 9eb50742bb7b4298dd94ce52a63e47879b6a872e Mon Sep 17 00:00:00 2001 From: achabense <60953653+achabense@users.noreply.github.com> Date: Mon, 14 Aug 2023 18:53:39 +0800 Subject: [PATCH 01/22] fix self-move-assignment --- stl/inc/any | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/stl/inc/any b/stl/inc/any index b3be1b10015..f0444772101 100644 --- a/stl/inc/any +++ b/stl/inc/any @@ -168,8 +168,10 @@ public: } any& operator=(any&& _That) noexcept { - reset(); - _Move_from(_That); + if (this != &_That) { + reset(); + _Move_from(_That); + } return *this; } From 2b4bd0d29f2696206b8fb572990a6c1ac1e27838 Mon Sep 17 00:00:00 2001 From: achabense <60953653+achabense@users.noreply.github.com> Date: Mon, 14 Aug 2023 19:39:09 +0800 Subject: [PATCH 02/22] add test for self-move-assignment --- tests/std/tests/P0220R1_any/test.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tests/std/tests/P0220R1_any/test.cpp b/tests/std/tests/P0220R1_any/test.cpp index 6d3d25e3552..720e5fe445c 100644 --- a/tests/std/tests/P0220R1_any/test.cpp +++ b/tests/std/tests/P0220R1_any/test.cpp @@ -3160,6 +3160,23 @@ namespace msvc { } #pragma warning(pop) } // namespace trivial + + namespace self_move_assign { + struct foo { + int val; + foo() : val(42) {} + ~foo() { + val = 0; + } + }; + void run_test() { + any a(foo{}); + a = std::move(a); + assert(a.has_value()); + assert(containsType(a)); + assert(any_cast(&a)->val == 42); + } + } // namespace self_move_assign } // namespace msvc int main() { @@ -3196,4 +3213,5 @@ int main() { msvc::size_and_alignment::run_test(); msvc::small_type::run_test(); msvc::trivial::run_test(); + msvc::self_move_assign::run_test(); } From 8f56d7ecb374f46618f403ea769517aaf623cabe Mon Sep 17 00:00:00 2001 From: achabense <60953653+achabense@users.noreply.github.com> Date: Mon, 14 Aug 2023 18:52:51 +0800 Subject: [PATCH 03/22] add `_STD` qualication to allow for incomplete pointer types etc --- stl/inc/any | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/stl/inc/any b/stl/inc/any index f0444772101..e77f9b9ef46 100644 --- a/stl/inc/any +++ b/stl/inc/any @@ -78,17 +78,17 @@ struct _Any_small_RTTI { // Hand-rolled vtable for nontrivial types that can be template static void __CLRCALL_PURE_OR_CDECL _Destroy_impl(void* const _Target) noexcept { - _Destroy_in_place(*static_cast<_Ty*>(_Target)); + _STD _Destroy_in_place(*static_cast<_Ty*>(_Target)); } template static void __CLRCALL_PURE_OR_CDECL _Copy_impl(void* const _Target, const void* const _Source) { - _Construct_in_place(*static_cast<_Ty*>(_Target), *static_cast(_Source)); + _STD _Construct_in_place(*static_cast<_Ty*>(_Target), *static_cast(_Source)); } template static void __CLRCALL_PURE_OR_CDECL _Move_impl(void* const _Target, void* const _Source) noexcept { - _Construct_in_place(*static_cast<_Ty*>(_Target), _STD move(*static_cast<_Ty*>(_Source))); + _STD _Construct_in_place(*static_cast<_Ty*>(_Target), _STD move(*static_cast<_Ty*>(_Source))); } _Destroy_fn* _Destroy; @@ -297,14 +297,14 @@ private: if constexpr (_Any_is_trivial<_Decayed>) { // using the _Trivial representation auto& _Obj = reinterpret_cast<_Decayed&>(_Storage._TrivialData); - _Construct_in_place(_Obj, _STD forward<_Types>(_Args)...); + _STD _Construct_in_place(_Obj, _STD forward<_Types>(_Args)...); _Storage._TypeData = reinterpret_cast(&typeid(_Decayed)) | static_cast(_Any_representation::_Trivial); return _Obj; } else if constexpr (_Any_is_small<_Decayed>) { // using the _Small representation auto& _Obj = reinterpret_cast<_Decayed&>(_Storage._SmallStorage._Data); - _Construct_in_place(_Obj, _STD forward<_Types>(_Args)...); + _STD _Construct_in_place(_Obj, _STD forward<_Types>(_Args)...); _Storage._SmallStorage._RTTI = &_Any_small_RTTI_obj<_Decayed>; _Storage._TypeData = reinterpret_cast(&typeid(_Decayed)) | static_cast(_Any_representation::_Small); From 8fe3f3c692859f8d94c14ff16b61e22e6ee09ad7 Mon Sep 17 00:00:00 2001 From: achabense <60953653+achabense@users.noreply.github.com> Date: Mon, 14 Aug 2023 19:50:26 +0800 Subject: [PATCH 04/22] add test for support for incomplete types --- .../env.lst | 4 ++ .../test.cpp | 37 +++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 tests/std/tests/Hmm_I_dont_know_how_to_name_this_folder/env.lst create mode 100644 tests/std/tests/Hmm_I_dont_know_how_to_name_this_folder/test.cpp diff --git a/tests/std/tests/Hmm_I_dont_know_how_to_name_this_folder/env.lst b/tests/std/tests/Hmm_I_dont_know_how_to_name_this_folder/env.lst new file mode 100644 index 00000000000..2de7aab2959 --- /dev/null +++ b/tests/std/tests/Hmm_I_dont_know_how_to_name_this_folder/env.lst @@ -0,0 +1,4 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +RUNALL_INCLUDE ..\usual_17_matrix.lst diff --git a/tests/std/tests/Hmm_I_dont_know_how_to_name_this_folder/test.cpp b/tests/std/tests/Hmm_I_dont_know_how_to_name_this_folder/test.cpp new file mode 100644 index 00000000000..1ecf6c330ef --- /dev/null +++ b/tests/std/tests/Hmm_I_dont_know_how_to_name_this_folder/test.cpp @@ -0,0 +1,37 @@ +// Copyright (c) Microsoft Corporation. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +#include +#include + +struct incomplete; + +template +struct wrapper { + T t; +}; + +struct nontrivial { + nontrivial() {} + ~nontrivial() {} +}; + +int main() { + using foo = wrapper*; + struct bar { + foo p{}; + nontrivial q{}; + }; + struct baz { + foo p[10]{}; + }; + + std::any a{foo{}}, b(bar{}), c{baz{}}; + a = a, b = b, c = c; + a = std::move(a), b = std::move(b), c = std::move(c); + auto a_ = std::any_cast(a); + auto b_ = std::any_cast(b); + auto c_ = std::any_cast(c); + + return 0; +} From cfe55ebc17234c0f7af04d0ad9af41f18ce714c7 Mon Sep 17 00:00:00 2001 From: achabense <60953653+achabense@users.noreply.github.com> Date: Mon, 14 Aug 2023 20:24:28 +0800 Subject: [PATCH 05/22] 10->20 --- .../std/tests/Hmm_I_dont_know_how_to_name_this_folder/test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/std/tests/Hmm_I_dont_know_how_to_name_this_folder/test.cpp b/tests/std/tests/Hmm_I_dont_know_how_to_name_this_folder/test.cpp index 1ecf6c330ef..1597b05efdb 100644 --- a/tests/std/tests/Hmm_I_dont_know_how_to_name_this_folder/test.cpp +++ b/tests/std/tests/Hmm_I_dont_know_how_to_name_this_folder/test.cpp @@ -23,7 +23,7 @@ int main() { nontrivial q{}; }; struct baz { - foo p[10]{}; + foo p[20]{}; }; std::any a{foo{}}, b(bar{}), c{baz{}}; From bbbff54f53ab8c0af914a808cbebc4d5861186c4 Mon Sep 17 00:00:00 2001 From: achabense <60953653+achabense@users.noreply.github.com> Date: Mon, 14 Aug 2023 22:16:34 +0800 Subject: [PATCH 06/22] rename test folder --- .../env.lst | 0 .../test.cpp | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename tests/std/tests/{Hmm_I_dont_know_how_to_name_this_folder => GH_003965_robust_against_adl_any}/env.lst (100%) rename tests/std/tests/{Hmm_I_dont_know_how_to_name_this_folder => GH_003965_robust_against_adl_any}/test.cpp (100%) diff --git a/tests/std/tests/Hmm_I_dont_know_how_to_name_this_folder/env.lst b/tests/std/tests/GH_003965_robust_against_adl_any/env.lst similarity index 100% rename from tests/std/tests/Hmm_I_dont_know_how_to_name_this_folder/env.lst rename to tests/std/tests/GH_003965_robust_against_adl_any/env.lst diff --git a/tests/std/tests/Hmm_I_dont_know_how_to_name_this_folder/test.cpp b/tests/std/tests/GH_003965_robust_against_adl_any/test.cpp similarity index 100% rename from tests/std/tests/Hmm_I_dont_know_how_to_name_this_folder/test.cpp rename to tests/std/tests/GH_003965_robust_against_adl_any/test.cpp From 33925fa9218d35a0b116ddbfe2d11d95a83ce1a4 Mon Sep 17 00:00:00 2001 From: achabense <60953653+achabense@users.noreply.github.com> Date: Mon, 14 Aug 2023 22:54:14 +0800 Subject: [PATCH 07/22] test fix --- tests/std/tests/GH_003965_robust_against_adl_any/test.cpp | 6 +++--- tests/std/tests/P0220R1_any/test.cpp | 4 ++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/tests/std/tests/GH_003965_robust_against_adl_any/test.cpp b/tests/std/tests/GH_003965_robust_against_adl_any/test.cpp index 1597b05efdb..01d3ad6c3f5 100644 --- a/tests/std/tests/GH_003965_robust_against_adl_any/test.cpp +++ b/tests/std/tests/GH_003965_robust_against_adl_any/test.cpp @@ -29,9 +29,9 @@ int main() { std::any a{foo{}}, b(bar{}), c{baz{}}; a = a, b = b, c = c; a = std::move(a), b = std::move(b), c = std::move(c); - auto a_ = std::any_cast(a); - auto b_ = std::any_cast(b); - auto c_ = std::any_cast(c); + (void) std::any_cast(a); + (void) std::any_cast(b); + (void) std::any_cast(c); return 0; } diff --git a/tests/std/tests/P0220R1_any/test.cpp b/tests/std/tests/P0220R1_any/test.cpp index 720e5fe445c..a9dd90a241e 100644 --- a/tests/std/tests/P0220R1_any/test.cpp +++ b/tests/std/tests/P0220R1_any/test.cpp @@ -3165,6 +3165,10 @@ namespace msvc { struct foo { int val; foo() : val(42) {} + foo(const foo&) = default; + foo& operator=(const foo&) = default; + foo(foo&&) = default; + foo& operator=(foo&&) = default; ~foo() { val = 0; } From 7666be392be6a846345ded17c6042f8338e4e41b Mon Sep 17 00:00:00 2001 From: achabense <60953653+achabense@users.noreply.github.com> Date: Mon, 14 Aug 2023 22:58:12 +0800 Subject: [PATCH 08/22] update `/tests/std/test.lst` --- tests/std/test.lst | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/std/test.lst b/tests/std/test.lst index c2190304dcc..df68e45e329 100644 --- a/tests/std/test.lst +++ b/tests/std/test.lst @@ -231,6 +231,7 @@ tests\GH_003676_format_large_hh_mm_ss_values tests\GH_003735_char_traits_signatures tests\GH_003840_tellg_when_reading_lf_file_in_text_mode tests\GH_003867_output_nan +tests\GH_003965_robust_against_adl_any tests\LWG2381_num_get_floating_point tests\LWG2597_complex_branch_cut tests\LWG3018_shared_ptr_function From 36ce5f626d087a4ec230f525b99035f725898ab5 Mon Sep 17 00:00:00 2001 From: achabense <60953653+achabense@users.noreply.github.com> Date: Mon, 14 Aug 2023 23:46:49 +0800 Subject: [PATCH 09/22] real test fix --- tests/std/tests/GH_003965_robust_against_adl_any/test.cpp | 5 +++-- tests/std/tests/P0220R1_any/test.cpp | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/tests/std/tests/GH_003965_robust_against_adl_any/test.cpp b/tests/std/tests/GH_003965_robust_against_adl_any/test.cpp index 01d3ad6c3f5..26ee467f2f6 100644 --- a/tests/std/tests/GH_003965_robust_against_adl_any/test.cpp +++ b/tests/std/tests/GH_003965_robust_against_adl_any/test.cpp @@ -27,8 +27,9 @@ int main() { }; std::any a{foo{}}, b(bar{}), c{baz{}}; - a = a, b = b, c = c; - a = std::move(a), b = std::move(b), c = std::move(c); + std::any *ap = &a, *bp = &b, *cp = &c; + a = *ap, b = *bp, c = *cp; + a = std::move(*ap), b = std::move(*bp), c = std::move(*cp); (void) std::any_cast(a); (void) std::any_cast(b); (void) std::any_cast(c); diff --git a/tests/std/tests/P0220R1_any/test.cpp b/tests/std/tests/P0220R1_any/test.cpp index a9dd90a241e..10a896899c4 100644 --- a/tests/std/tests/P0220R1_any/test.cpp +++ b/tests/std/tests/P0220R1_any/test.cpp @@ -3175,7 +3175,8 @@ namespace msvc { }; void run_test() { any a(foo{}); - a = std::move(a); + any* ap = &a; + a = std::move(*ap); assert(a.has_value()); assert(containsType(a)); assert(any_cast(&a)->val == 42); From 5f9f68310309617891ad2187bc58fc29307f3972 Mon Sep 17 00:00:00 2001 From: achabense <60953653+achabense@users.noreply.github.com> Date: Tue, 15 Aug 2023 00:02:36 +0800 Subject: [PATCH 10/22] suppress warnings directly --- .../tests/GH_003965_robust_against_adl_any/test.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/tests/std/tests/GH_003965_robust_against_adl_any/test.cpp b/tests/std/tests/GH_003965_robust_against_adl_any/test.cpp index 26ee467f2f6..4843baf5dcb 100644 --- a/tests/std/tests/GH_003965_robust_against_adl_any/test.cpp +++ b/tests/std/tests/GH_003965_robust_against_adl_any/test.cpp @@ -4,6 +4,11 @@ #include #include +#ifdef __clang__ +_Pragma("clang diagnostic ignored \"-Wself-assign-overloaded\""); +_Pragma("clang diagnostic ignored \"-Wself-move\""); +#endif + struct incomplete; template @@ -27,9 +32,8 @@ int main() { }; std::any a{foo{}}, b(bar{}), c{baz{}}; - std::any *ap = &a, *bp = &b, *cp = &c; - a = *ap, b = *bp, c = *cp; - a = std::move(*ap), b = std::move(*bp), c = std::move(*cp); + a = a, b = b, c = c; + a = std::move(a), b = std::move(b), c = std::move(c); (void) std::any_cast(a); (void) std::any_cast(b); (void) std::any_cast(c); From a44af87a8d77abed2503a6ddb1178d8037b811cf Mon Sep 17 00:00:00 2001 From: achabense <60953653+achabense@users.noreply.github.com> Date: Tue, 15 Aug 2023 00:22:38 +0800 Subject: [PATCH 11/22] better approach --- tests/std/tests/P0220R1_any/test.cpp | 26 +++----------------------- 1 file changed, 3 insertions(+), 23 deletions(-) diff --git a/tests/std/tests/P0220R1_any/test.cpp b/tests/std/tests/P0220R1_any/test.cpp index 10a896899c4..f90cb069519 100644 --- a/tests/std/tests/P0220R1_any/test.cpp +++ b/tests/std/tests/P0220R1_any/test.cpp @@ -2575,16 +2575,19 @@ namespace msvc { // small any a{small{42}}; a = std::move(a); + assert(a.has_value()); } { // large any a{large{42}}; a = std::move(a); + assert(a.has_value()); } { // trivial any a{int{42}}; a = std::move(a); + assert(a.has_value()); } } #ifdef __clang__ @@ -3160,28 +3163,6 @@ namespace msvc { } #pragma warning(pop) } // namespace trivial - - namespace self_move_assign { - struct foo { - int val; - foo() : val(42) {} - foo(const foo&) = default; - foo& operator=(const foo&) = default; - foo(foo&&) = default; - foo& operator=(foo&&) = default; - ~foo() { - val = 0; - } - }; - void run_test() { - any a(foo{}); - any* ap = &a; - a = std::move(*ap); - assert(a.has_value()); - assert(containsType(a)); - assert(any_cast(&a)->val == 42); - } - } // namespace self_move_assign } // namespace msvc int main() { @@ -3218,5 +3199,4 @@ int main() { msvc::size_and_alignment::run_test(); msvc::small_type::run_test(); msvc::trivial::run_test(); - msvc::self_move_assign::run_test(); } From 02b0d34b7624697df1df3ec886c49b004d05e188 Mon Sep 17 00:00:00 2001 From: achabense <60953653+achabense@users.noreply.github.com> Date: Tue, 15 Aug 2023 00:30:15 +0800 Subject: [PATCH 12/22] nits --- tests/std/tests/P0220R1_any/test.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/std/tests/P0220R1_any/test.cpp b/tests/std/tests/P0220R1_any/test.cpp index f90cb069519..41921ab1f6b 100644 --- a/tests/std/tests/P0220R1_any/test.cpp +++ b/tests/std/tests/P0220R1_any/test.cpp @@ -2575,19 +2575,19 @@ namespace msvc { // small any a{small{42}}; a = std::move(a); - assert(a.has_value()); + assertContains(a, 42); } { // large any a{large{42}}; a = std::move(a); - assert(a.has_value()); + assertContains(a, 42); } { // trivial any a{int{42}}; a = std::move(a); - assert(a.has_value()); + assertContains(a, 42); } } #ifdef __clang__ From 64890281a97cae60366c5e21d740d45e00a3f738 Mon Sep 17 00:00:00 2001 From: achabense <60953653+achabense@users.noreply.github.com> Date: Tue, 15 Aug 2023 00:35:41 +0800 Subject: [PATCH 13/22] nits --- tests/std/tests/P0220R1_any/test.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/std/tests/P0220R1_any/test.cpp b/tests/std/tests/P0220R1_any/test.cpp index 41921ab1f6b..086aa9a4f24 100644 --- a/tests/std/tests/P0220R1_any/test.cpp +++ b/tests/std/tests/P0220R1_any/test.cpp @@ -2570,6 +2570,7 @@ namespace msvc { // empty any a; a = std::move(a); + assertEmpty(a); } { // small From 03fba3975da1333ce8f471dde5a2d14e21498262 Mon Sep 17 00:00:00 2001 From: achabense <60953653+achabense@users.noreply.github.com> Date: Tue, 15 Aug 2023 11:30:14 +0800 Subject: [PATCH 14/22] make adl-test more focused --- .../GH_003965_robust_against_adl_any/test.cpp | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/tests/std/tests/GH_003965_robust_against_adl_any/test.cpp b/tests/std/tests/GH_003965_robust_against_adl_any/test.cpp index 4843baf5dcb..c11ac4e7200 100644 --- a/tests/std/tests/GH_003965_robust_against_adl_any/test.cpp +++ b/tests/std/tests/GH_003965_robust_against_adl_any/test.cpp @@ -2,12 +2,6 @@ // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception #include -#include - -#ifdef __clang__ -_Pragma("clang diagnostic ignored \"-Wself-assign-overloaded\""); -_Pragma("clang diagnostic ignored \"-Wself-move\""); -#endif struct incomplete; @@ -32,11 +26,14 @@ int main() { }; std::any a{foo{}}, b(bar{}), c{baz{}}; - a = a, b = b, c = c; - a = std::move(a), b = std::move(b), c = std::move(c); + + a = foo{}, b = bar{}, c = baz{}; + + a.emplace(); + b.emplace(); + c.emplace(); + (void) std::any_cast(a); (void) std::any_cast(b); (void) std::any_cast(c); - - return 0; } From da3f334ee08acd379d5c06d902fd9391a53cdaa9 Mon Sep 17 00:00:00 2001 From: achabense <60953653+achabense@users.noreply.github.com> Date: Tue, 15 Aug 2023 14:44:30 +0800 Subject: [PATCH 15/22] self-assignment real fix --- stl/inc/any | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/stl/inc/any b/stl/inc/any index e77f9b9ef46..4c238ec7837 100644 --- a/stl/inc/any +++ b/stl/inc/any @@ -163,15 +163,12 @@ public: // Assignment [any.assign] any& operator=(const any& _That) { - *this = any{_That}; + _Reset_and_move_from(_That); return *this; } any& operator=(any&& _That) noexcept { - if (this != &_That) { - reset(); - _Move_from(_That); - } + _Reset_and_move_from(_STD move(_That)); return *this; } @@ -292,6 +289,11 @@ private: } } + void _Reset_and_move_from(any _That) noexcept { + reset(); + _Move_from(_That); + } + template _Decayed& _Emplace(_Types&&... _Args) { // emplace construct _Decayed if constexpr (_Any_is_trivial<_Decayed>) { From 798e89cca18a4b57e9c75b9cc6a0d4b0163d7389 Mon Sep 17 00:00:00 2001 From: achabense <60953653+achabense@users.noreply.github.com> Date: Tue, 15 Aug 2023 15:26:09 +0800 Subject: [PATCH 16/22] enhance tests --- stl/inc/any | 2 +- tests/std/tests/P0220R1_any/test.cpp | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/stl/inc/any b/stl/inc/any index 4c238ec7837..4f3dd0ac417 100644 --- a/stl/inc/any +++ b/stl/inc/any @@ -289,7 +289,7 @@ private: } } - void _Reset_and_move_from(any _That) noexcept { + void _Reset_and_move_from(any _That) noexcept { // intentionally pass by value reset(); _Move_from(_That); } diff --git a/tests/std/tests/P0220R1_any/test.cpp b/tests/std/tests/P0220R1_any/test.cpp index 086aa9a4f24..3eb1816630d 100644 --- a/tests/std/tests/P0220R1_any/test.cpp +++ b/tests/std/tests/P0220R1_any/test.cpp @@ -2571,24 +2571,44 @@ namespace msvc { any a; a = std::move(a); assertEmpty(a); + + a = std::make_any(); + any* inner_any = any_cast(&a); + a = std::move(*inner_any); + assertEmpty(a); } { // small any a{small{42}}; a = std::move(a); assertContains(a, 42); + + a = std::make_any(small{42}); + any* inner_any = any_cast(&a); + a = std::move(*inner_any); + assertContains(a, 42); } { // large any a{large{42}}; a = std::move(a); assertContains(a, 42); + + a = std::make_any(large{42}); + any* inner_any = any_cast(&a); + a = std::move(*inner_any); + assertContains(a, 42); } { // trivial any a{int{42}}; a = std::move(a); assertContains(a, 42); + + a = std::make_any(int{42}); + any* inner_any = any_cast(&a); + a = std::move(*inner_any); + assertContains(a, 42); } } #ifdef __clang__ From 2496df55dac4360b43e2c0c6e37436621a4d8844 Mon Sep 17 00:00:00 2001 From: achabense <60953653+achabense@users.noreply.github.com> Date: Tue, 15 Aug 2023 16:10:00 +0800 Subject: [PATCH 17/22] improvements --- stl/inc/any | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/stl/inc/any b/stl/inc/any index 4f3dd0ac417..1959597caa3 100644 --- a/stl/inc/any +++ b/stl/inc/any @@ -163,12 +163,12 @@ public: // Assignment [any.assign] any& operator=(const any& _That) { - _Reset_and_move_from(_That); + _Assign(_That); return *this; } any& operator=(any&& _That) noexcept { - _Reset_and_move_from(_STD move(_That)); + _Assign(_STD move(_That)); return *this; } @@ -177,7 +177,7 @@ public: int> = 0> any& operator=(_ValueType&& _Value) { // replace contained value with an object of type decay_t<_ValueType> initialized from _Value - *this = any{_STD forward<_ValueType>(_Value)}; + _Assign(any{_STD forward<_ValueType>(_Value)}); return *this; } @@ -289,7 +289,7 @@ private: } } - void _Reset_and_move_from(any _That) noexcept { // intentionally pass by value + void _Assign(any _That) noexcept { // intentionally pass by value reset(); _Move_from(_That); } From ff1d9dffe822b7dbf49c38f3ba34fed0c0d7fd56 Mon Sep 17 00:00:00 2001 From: achabense <60953653+achabense@users.noreply.github.com> Date: Wed, 16 Aug 2023 10:38:57 +0800 Subject: [PATCH 18/22] make value creation obvious --- stl/inc/any | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stl/inc/any b/stl/inc/any index 1959597caa3..74a153feed4 100644 --- a/stl/inc/any +++ b/stl/inc/any @@ -163,12 +163,12 @@ public: // Assignment [any.assign] any& operator=(const any& _That) { - _Assign(_That); + _Assign(any{_That}); return *this; } any& operator=(any&& _That) noexcept { - _Assign(_STD move(_That)); + _Assign(any{_STD move(_That)}); return *this; } From a9c8d834344c333b30260101e89e0dff988e2f63 Mon Sep 17 00:00:00 2001 From: achabense <60953653+achabense@users.noreply.github.com> Date: Wed, 16 Aug 2023 10:41:09 +0800 Subject: [PATCH 19/22] simplify ADL test; move to P0220R1_any --- tests/std/test.lst | 1 - .../GH_003965_robust_against_adl_any/env.lst | 4 -- .../GH_003965_robust_against_adl_any/test.cpp | 39 ------------------- tests/std/tests/P0220R1_any/test.cpp | 22 +++++++++++ 4 files changed, 22 insertions(+), 44 deletions(-) delete mode 100644 tests/std/tests/GH_003965_robust_against_adl_any/env.lst delete mode 100644 tests/std/tests/GH_003965_robust_against_adl_any/test.cpp diff --git a/tests/std/test.lst b/tests/std/test.lst index df68e45e329..c2190304dcc 100644 --- a/tests/std/test.lst +++ b/tests/std/test.lst @@ -231,7 +231,6 @@ tests\GH_003676_format_large_hh_mm_ss_values tests\GH_003735_char_traits_signatures tests\GH_003840_tellg_when_reading_lf_file_in_text_mode tests\GH_003867_output_nan -tests\GH_003965_robust_against_adl_any tests\LWG2381_num_get_floating_point tests\LWG2597_complex_branch_cut tests\LWG3018_shared_ptr_function diff --git a/tests/std/tests/GH_003965_robust_against_adl_any/env.lst b/tests/std/tests/GH_003965_robust_against_adl_any/env.lst deleted file mode 100644 index 2de7aab2959..00000000000 --- a/tests/std/tests/GH_003965_robust_against_adl_any/env.lst +++ /dev/null @@ -1,4 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - -RUNALL_INCLUDE ..\usual_17_matrix.lst diff --git a/tests/std/tests/GH_003965_robust_against_adl_any/test.cpp b/tests/std/tests/GH_003965_robust_against_adl_any/test.cpp deleted file mode 100644 index c11ac4e7200..00000000000 --- a/tests/std/tests/GH_003965_robust_against_adl_any/test.cpp +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - -#include - -struct incomplete; - -template -struct wrapper { - T t; -}; - -struct nontrivial { - nontrivial() {} - ~nontrivial() {} -}; - -int main() { - using foo = wrapper*; - struct bar { - foo p{}; - nontrivial q{}; - }; - struct baz { - foo p[20]{}; - }; - - std::any a{foo{}}, b(bar{}), c{baz{}}; - - a = foo{}, b = bar{}, c = baz{}; - - a.emplace(); - b.emplace(); - c.emplace(); - - (void) std::any_cast(a); - (void) std::any_cast(b); - (void) std::any_cast(c); -} diff --git a/tests/std/tests/P0220R1_any/test.cpp b/tests/std/tests/P0220R1_any/test.cpp index 3eb1816630d..f8bf9e44f81 100644 --- a/tests/std/tests/P0220R1_any/test.cpp +++ b/tests/std/tests/P0220R1_any/test.cpp @@ -3184,6 +3184,27 @@ namespace msvc { } #pragma warning(pop) } // namespace trivial + + namespace gh_140_robust_against_adl { + struct incomplete; + + template + struct wrapper { + T t; + }; + + void run_test() { + using _trivial = wrapper*; + using _small = std::pair<_trivial, small>; + using _large = std::pair<_trivial, large>; + + globalMemCounter.disable_allocations = true; + any a{_trivial{}}; + any b{_small{}}; + globalMemCounter.disable_allocations = false; + any c{_large{}}; + } + } // namespace gh_140_robust_against_adl } // namespace msvc int main() { @@ -3220,4 +3241,5 @@ int main() { msvc::size_and_alignment::run_test(); msvc::small_type::run_test(); msvc::trivial::run_test(); + msvc::gh_140_robust_against_adl::run_test(); } From 193e2fc19e21519fa35becdcd3044b47106c8219 Mon Sep 17 00:00:00 2001 From: achabense <60953653+achabense@users.noreply.github.com> Date: Sun, 20 Aug 2023 15:46:24 +0800 Subject: [PATCH 20/22] enhance tests --- tests/std/tests/P0220R1_any/test.cpp | 37 +++++++++++++++++----------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/tests/std/tests/P0220R1_any/test.cpp b/tests/std/tests/P0220R1_any/test.cpp index f8bf9e44f81..3cb2cf6faf3 100644 --- a/tests/std/tests/P0220R1_any/test.cpp +++ b/tests/std/tests/P0220R1_any/test.cpp @@ -2572,9 +2572,8 @@ namespace msvc { a = std::move(a); assertEmpty(a); - a = std::make_any(); - any* inner_any = any_cast(&a); - a = std::move(*inner_any); + a = std::make_any(); + a = any_cast(std::move(a)); // extract inner any assertEmpty(a); } { @@ -2583,9 +2582,8 @@ namespace msvc { a = std::move(a); assertContains(a, 42); - a = std::make_any(small{42}); - any* inner_any = any_cast(&a); - a = std::move(*inner_any); + a = std::make_any(small{42}); + a = any_cast(std::move(a)); // extract inner any assertContains(a, 42); } { @@ -2594,9 +2592,8 @@ namespace msvc { a = std::move(a); assertContains(a, 42); - a = std::make_any(large{42}); - any* inner_any = any_cast(&a); - a = std::move(*inner_any); + a = std::make_any(large{42}); + a = any_cast(std::move(a)); // extract inner any assertContains(a, 42); } { @@ -2605,9 +2602,8 @@ namespace msvc { a = std::move(a); assertContains(a, 42); - a = std::make_any(int{42}); - any* inner_any = any_cast(&a); - a = std::move(*inner_any); + a = std::make_any(int{42}); + a = any_cast(std::move(a)); // extract inner any assertContains(a, 42); } } @@ -3193,16 +3189,27 @@ namespace msvc { T t; }; + template + void test_for() { + any a; + a = any{Type()}; + a = any{std::in_place_type}; + a = Type(); + a = std::make_any(); + a.emplace(); + assert(any_cast(&a) != nullptr); + } + void run_test() { using _trivial = wrapper*; using _small = std::pair<_trivial, small>; using _large = std::pair<_trivial, large>; globalMemCounter.disable_allocations = true; - any a{_trivial{}}; - any b{_small{}}; + test_for<_trivial>(); + test_for<_small>(); globalMemCounter.disable_allocations = false; - any c{_large{}}; + test_for<_large>(); } } // namespace gh_140_robust_against_adl } // namespace msvc From 70207a85b1de492f2fbc0c16cfeea43c248128ae Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Fri, 15 Sep 2023 13:11:55 -0700 Subject: [PATCH 21/22] Implicitly construct when calling `_Assign`. --- stl/inc/any | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/stl/inc/any b/stl/inc/any index 74a153feed4..4986245dc3b 100644 --- a/stl/inc/any +++ b/stl/inc/any @@ -163,12 +163,12 @@ public: // Assignment [any.assign] any& operator=(const any& _That) { - _Assign(any{_That}); + _Assign(_That); return *this; } any& operator=(any&& _That) noexcept { - _Assign(any{_STD move(_That)}); + _Assign(_STD move(_That)); return *this; } @@ -177,7 +177,7 @@ public: int> = 0> any& operator=(_ValueType&& _Value) { // replace contained value with an object of type decay_t<_ValueType> initialized from _Value - _Assign(any{_STD forward<_ValueType>(_Value)}); + _Assign(_STD forward<_ValueType>(_Value)); return *this; } From 3afe9516cbf737fc8094f8462670e1f6174c2424 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Wed, 20 Sep 2023 20:54:47 -0700 Subject: [PATCH 22/22] Work around `/clr`. --- tests/std/tests/P0220R1_any/test.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/std/tests/P0220R1_any/test.cpp b/tests/std/tests/P0220R1_any/test.cpp index 3cb2cf6faf3..23b1a93fb57 100644 --- a/tests/std/tests/P0220R1_any/test.cpp +++ b/tests/std/tests/P0220R1_any/test.cpp @@ -3181,6 +3181,7 @@ namespace msvc { #pragma warning(pop) } // namespace trivial +#ifndef _M_CEE // TRANSITION, VSO-1659496 namespace gh_140_robust_against_adl { struct incomplete; @@ -3212,6 +3213,7 @@ namespace msvc { test_for<_large>(); } } // namespace gh_140_robust_against_adl +#endif // _M_CEE } // namespace msvc int main() { @@ -3248,5 +3250,7 @@ int main() { msvc::size_and_alignment::run_test(); msvc::small_type::run_test(); msvc::trivial::run_test(); +#ifndef _M_CEE // TRANSITION, VSO-1659496 msvc::gh_140_robust_against_adl::run_test(); +#endif // _M_CEE }