From 1ebc9789b09b7aeefc3935afcc963310f428e0f4 Mon Sep 17 00:00:00 2001 From: Igor Zhukov Date: Sun, 12 Dec 2021 12:07:17 +0700 Subject: [PATCH 1/3] Excessive unwrapping in std::ref/cref --- stl/inc/type_traits | 4 ++-- tests/tr1/tests/functional9/test.cpp | 13 +++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/stl/inc/type_traits b/stl/inc/type_traits index 995c15966ce..2aa95b03e48 100644 --- a/stl/inc/type_traits +++ b/stl/inc/type_traits @@ -1842,7 +1842,7 @@ void ref(const _Ty&&) = delete; template _NODISCARD _CONSTEXPR20 reference_wrapper<_Ty> ref(reference_wrapper<_Ty> _Val) noexcept { - return _STD ref(_Val.get()); + return _Val; } template @@ -1855,7 +1855,7 @@ void cref(const _Ty&&) = delete; template _NODISCARD _CONSTEXPR20 reference_wrapper cref(reference_wrapper<_Ty> _Val) noexcept { - return _STD cref(_Val.get()); + return _Val; } #if _HAS_CXX20 diff --git a/tests/tr1/tests/functional9/test.cpp b/tests/tr1/tests/functional9/test.cpp index 055fe3e4385..0a5ae3e96df 100644 --- a/tests/tr1/tests/functional9/test.cpp +++ b/tests/tr1/tests/functional9/test.cpp @@ -60,6 +60,19 @@ static void t_invoke() { // test invoke CHECK_INT(STD invoke(sum4, 1, 3, 5, 7), 16); } +// COMPILE-ONLY +void test_LWG_3146() { + int i = 0; + STD reference_wrapper ri(i); + STD reference_wrapper> rri(ri); + + auto reference = STD ref(rri); + auto const_reference = STD cref(rri); + + (void) reference; + (void) const_reference; +} + void test_main() { // test header // reference_wrapper::operator() with rvalues call1(STD cref(fake_lvalue(&f1))); From d944686113098f89b82c8ff15540356b9d976f78 Mon Sep 17 00:00:00 2001 From: Igor Zhukov Date: Sun, 12 Dec 2021 13:27:44 +0700 Subject: [PATCH 2/3] test return type Co-authored-by: Michael Schellenberger Costa --- tests/tr1/tests/functional9/test.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/tr1/tests/functional9/test.cpp b/tests/tr1/tests/functional9/test.cpp index 0a5ae3e96df..10d6c635dbe 100644 --- a/tests/tr1/tests/functional9/test.cpp +++ b/tests/tr1/tests/functional9/test.cpp @@ -69,8 +69,10 @@ void test_LWG_3146() { auto reference = STD ref(rri); auto const_reference = STD cref(rri); - (void) reference; - (void) const_reference; + static_assert(STD is_same_v>>, + "LWG-3146 is not implemented"); + static_assert(STD is_same_v>>, + "LWG-3146 is not implemented"); } void test_main() { // test header From 2fb85e6066802ec31af551fceab95177e067090f Mon Sep 17 00:00:00 2001 From: Igor Zhukov Date: Sun, 12 Dec 2021 14:42:09 +0700 Subject: [PATCH 3/3] extract LWG-3146 test into a separate test from tr1 test --- tests/std/test.lst | 1 + .../env.lst | 4 ++++ .../test.compile.pass.cpp | 23 +++++++++++++++++++ tests/tr1/tests/functional9/test.cpp | 15 ------------ 4 files changed, 28 insertions(+), 15 deletions(-) create mode 100644 tests/std/tests/LWG3146_excessive_unwrapping_ref_cref/env.lst create mode 100644 tests/std/tests/LWG3146_excessive_unwrapping_ref_cref/test.compile.pass.cpp diff --git a/tests/std/test.lst b/tests/std/test.lst index 83422b1229f..eb23654d7e4 100644 --- a/tests/std/test.lst +++ b/tests/std/test.lst @@ -192,6 +192,7 @@ tests\GH_002058_debug_iterator_race tests\GH_002120_streambuf_seekpos_and_seekoff tests\LWG2597_complex_branch_cut tests\LWG3018_shared_ptr_function +tests\LWG3146_excessive_unwrapping_ref_cref tests\LWG3422_seed_seq_ctors tests\LWG3480_directory_iterator_range tests\P0019R8_atomic_ref diff --git a/tests/std/tests/LWG3146_excessive_unwrapping_ref_cref/env.lst b/tests/std/tests/LWG3146_excessive_unwrapping_ref_cref/env.lst new file mode 100644 index 00000000000..19f025bd0e6 --- /dev/null +++ b/tests/std/tests/LWG3146_excessive_unwrapping_ref_cref/env.lst @@ -0,0 +1,4 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +RUNALL_INCLUDE ..\usual_matrix.lst diff --git a/tests/std/tests/LWG3146_excessive_unwrapping_ref_cref/test.compile.pass.cpp b/tests/std/tests/LWG3146_excessive_unwrapping_ref_cref/test.compile.pass.cpp new file mode 100644 index 00000000000..52971d585cb --- /dev/null +++ b/tests/std/tests/LWG3146_excessive_unwrapping_ref_cref/test.compile.pass.cpp @@ -0,0 +1,23 @@ +// Copyright (c) Microsoft Corporation. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +#include +#include + +using namespace std; + +void test_LWG_3146() { + int i = 0; + reference_wrapper ri(i); + reference_wrapper> rri(ri); + + auto reference = ref(rri); + auto const_reference = cref(rri); + + static_assert( + is_same_v>>, "LWG-3146 is not implemented"); + static_assert(is_same_v>>, + "LWG-3146 is not implemented"); +} + +int main() {} // COMPILE-ONLY diff --git a/tests/tr1/tests/functional9/test.cpp b/tests/tr1/tests/functional9/test.cpp index 10d6c635dbe..055fe3e4385 100644 --- a/tests/tr1/tests/functional9/test.cpp +++ b/tests/tr1/tests/functional9/test.cpp @@ -60,21 +60,6 @@ static void t_invoke() { // test invoke CHECK_INT(STD invoke(sum4, 1, 3, 5, 7), 16); } -// COMPILE-ONLY -void test_LWG_3146() { - int i = 0; - STD reference_wrapper ri(i); - STD reference_wrapper> rri(ri); - - auto reference = STD ref(rri); - auto const_reference = STD cref(rri); - - static_assert(STD is_same_v>>, - "LWG-3146 is not implemented"); - static_assert(STD is_same_v>>, - "LWG-3146 is not implemented"); -} - void test_main() { // test header // reference_wrapper::operator() with rvalues call1(STD cref(fake_lvalue(&f1)));