From 46aeb0d281b69e17f61984d2cc2b99b6a7fccc9c Mon Sep 17 00:00:00 2001 From: Jakub Mazurkiewicz Date: Wed, 16 Nov 2022 19:42:18 +0100 Subject: [PATCH 1/2] Implement LWG-3515 --- stl/inc/stacktrace | 7 ++-- tests/std/test.lst | 1 + .../env.lst | 4 ++ .../test.compile.pass.cpp | 39 +++++++++++++++++++ 4 files changed, 47 insertions(+), 4 deletions(-) create mode 100644 tests/std/tests/LWG3515_stacktrace_ostream_operator_should_be_less_templatized/env.lst create mode 100644 tests/std/tests/LWG3515_stacktrace_ostream_operator_should_be_less_templatized/test.compile.pass.cpp diff --git a/stl/inc/stacktrace b/stl/inc/stacktrace index 0c9e184c73..77393c6348 100644 --- a/stl/inc/stacktrace +++ b/stl/inc/stacktrace @@ -339,13 +339,12 @@ _NODISCARD string to_string(const basic_stacktrace<_Alloc>& _St) { return _Result; } -_EXPORT_STD template -basic_ostream<_CharT, _Traits>& operator<<(basic_ostream<_CharT, _Traits>& _Os, const stacktrace_entry& _Fx) { +_EXPORT_STD ostream& operator<<(ostream& _Os, const stacktrace_entry& _Fx) { return _Os << _STD to_string(_Fx); } -_EXPORT_STD template -basic_ostream<_CharT, _Traits>& operator<<(basic_ostream<_CharT, _Traits>& _Os, const basic_stacktrace<_Alloc>& _St) { +_EXPORT_STD template +ostream& operator<<(ostream& _Os, const basic_stacktrace<_Alloc>& _St) { return _Os << _STD to_string(_St); } diff --git a/tests/std/test.lst b/tests/std/test.lst index 9af561348b..98e7b58b31 100644 --- a/tests/std/test.lst +++ b/tests/std/test.lst @@ -224,6 +224,7 @@ tests\LWG3146_excessive_unwrapping_ref_cref tests\LWG3234_math_special_overloads tests\LWG3422_seed_seq_ctors tests\LWG3480_directory_iterator_range +tests\LWG3515_stacktrace_ostream_operator_should_be_less_templatized tests\LWG3610_iota_view_size_and_integer_class tests\P0019R8_atomic_ref tests\P0024R2_parallel_algorithms_adjacent_difference diff --git a/tests/std/tests/LWG3515_stacktrace_ostream_operator_should_be_less_templatized/env.lst b/tests/std/tests/LWG3515_stacktrace_ostream_operator_should_be_less_templatized/env.lst new file mode 100644 index 0000000000..642f530ffa --- /dev/null +++ b/tests/std/tests/LWG3515_stacktrace_ostream_operator_should_be_less_templatized/env.lst @@ -0,0 +1,4 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +RUNALL_INCLUDE ..\usual_latest_matrix.lst diff --git a/tests/std/tests/LWG3515_stacktrace_ostream_operator_should_be_less_templatized/test.compile.pass.cpp b/tests/std/tests/LWG3515_stacktrace_ostream_operator_should_be_less_templatized/test.compile.pass.cpp new file mode 100644 index 0000000000..b6bb0188f1 --- /dev/null +++ b/tests/std/tests/LWG3515_stacktrace_ostream_operator_should_be_less_templatized/test.compile.pass.cpp @@ -0,0 +1,39 @@ +// Copyright (c) Microsoft Corporation. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +#include +#include +#include +#include +#include +#include +#include + +using namespace std; + +template > +concept CanPrintStacktrace = requires(Ostream& os, const stacktrace_entry& f, const basic_stacktrace& st) { + os << f; + os << st; + }; + +template +struct FancyCharTraits : char_traits {}; + +static_assert(CanPrintStacktrace); +static_assert(CanPrintStacktrace); +static_assert(CanPrintStacktrace>); + +static_assert(!CanPrintStacktrace); +static_assert(!CanPrintStacktrace); +static_assert(!CanPrintStacktrace>); + +using FancyCharStream = basic_ostream>; +static_assert(!CanPrintStacktrace); +static_assert(!CanPrintStacktrace>); + +using FancyWcharStream = basic_ostream>; +static_assert(!CanPrintStacktrace); +static_assert(!CanPrintStacktrace>); + +int main() {} // COMPILE-ONLY From 8a8a967121c427ecc0b102d812a5e4aea2a61e78 Mon Sep 17 00:00:00 2001 From: Jakub Mazurkiewicz Date: Wed, 16 Nov 2022 20:46:11 +0100 Subject: [PATCH 2/2] Casey's comments --- stl/inc/stacktrace | 3 +- tests/std/test.lst | 1 - .../env.lst | 4 -- .../test.compile.pass.cpp | 39 ------------------- tests/std/tests/P0881R7_stacktrace/test.cpp | 31 +++++++++++++++ 5 files changed, 33 insertions(+), 45 deletions(-) delete mode 100644 tests/std/tests/LWG3515_stacktrace_ostream_operator_should_be_less_templatized/env.lst delete mode 100644 tests/std/tests/LWG3515_stacktrace_ostream_operator_should_be_less_templatized/test.compile.pass.cpp diff --git a/stl/inc/stacktrace b/stl/inc/stacktrace index 77393c6348..69e12dd240 100644 --- a/stl/inc/stacktrace +++ b/stl/inc/stacktrace @@ -339,7 +339,8 @@ _NODISCARD string to_string(const basic_stacktrace<_Alloc>& _St) { return _Result; } -_EXPORT_STD ostream& operator<<(ostream& _Os, const stacktrace_entry& _Fx) { +_EXPORT_STD template +ostream& operator<<(ostream& _Os, const stacktrace_entry& _Fx) { return _Os << _STD to_string(_Fx); } diff --git a/tests/std/test.lst b/tests/std/test.lst index 98e7b58b31..9af561348b 100644 --- a/tests/std/test.lst +++ b/tests/std/test.lst @@ -224,7 +224,6 @@ tests\LWG3146_excessive_unwrapping_ref_cref tests\LWG3234_math_special_overloads tests\LWG3422_seed_seq_ctors tests\LWG3480_directory_iterator_range -tests\LWG3515_stacktrace_ostream_operator_should_be_less_templatized tests\LWG3610_iota_view_size_and_integer_class tests\P0019R8_atomic_ref tests\P0024R2_parallel_algorithms_adjacent_difference diff --git a/tests/std/tests/LWG3515_stacktrace_ostream_operator_should_be_less_templatized/env.lst b/tests/std/tests/LWG3515_stacktrace_ostream_operator_should_be_less_templatized/env.lst deleted file mode 100644 index 642f530ffa..0000000000 --- a/tests/std/tests/LWG3515_stacktrace_ostream_operator_should_be_less_templatized/env.lst +++ /dev/null @@ -1,4 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - -RUNALL_INCLUDE ..\usual_latest_matrix.lst diff --git a/tests/std/tests/LWG3515_stacktrace_ostream_operator_should_be_less_templatized/test.compile.pass.cpp b/tests/std/tests/LWG3515_stacktrace_ostream_operator_should_be_less_templatized/test.compile.pass.cpp deleted file mode 100644 index b6bb0188f1..0000000000 --- a/tests/std/tests/LWG3515_stacktrace_ostream_operator_should_be_less_templatized/test.compile.pass.cpp +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - -#include -#include -#include -#include -#include -#include -#include - -using namespace std; - -template > -concept CanPrintStacktrace = requires(Ostream& os, const stacktrace_entry& f, const basic_stacktrace& st) { - os << f; - os << st; - }; - -template -struct FancyCharTraits : char_traits {}; - -static_assert(CanPrintStacktrace); -static_assert(CanPrintStacktrace); -static_assert(CanPrintStacktrace>); - -static_assert(!CanPrintStacktrace); -static_assert(!CanPrintStacktrace); -static_assert(!CanPrintStacktrace>); - -using FancyCharStream = basic_ostream>; -static_assert(!CanPrintStacktrace); -static_assert(!CanPrintStacktrace>); - -using FancyWcharStream = basic_ostream>; -static_assert(!CanPrintStacktrace); -static_assert(!CanPrintStacktrace>); - -int main() {} // COMPILE-ONLY diff --git a/tests/std/tests/P0881R7_stacktrace/test.cpp b/tests/std/tests/P0881R7_stacktrace/test.cpp index 74e67bf330..b726bb7dad 100644 --- a/tests/std/tests/P0881R7_stacktrace/test.cpp +++ b/tests/std/tests/P0881R7_stacktrace/test.cpp @@ -2,9 +2,12 @@ // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception #include +#include #include #include #include +#include +#include #include #include #include @@ -20,6 +23,34 @@ using namespace std; +#if defined(__cpp_lib_concepts) // TRANSITION, GH-395 +template > +concept CanPrintStacktrace = + requires(Ostream& os, const stacktrace_entry& f, const basic_stacktrace& st) { + { os << f } -> same_as&>; + { os << st } -> same_as&>; + }; + +template +struct FancyCharTraits : char_traits {}; + +static_assert(CanPrintStacktrace); +static_assert(CanPrintStacktrace); +static_assert(CanPrintStacktrace>); + +static_assert(!CanPrintStacktrace); +static_assert(!CanPrintStacktrace); +static_assert(!CanPrintStacktrace>); + +using FancyCharStream = basic_ostream>; +static_assert(!CanPrintStacktrace); +static_assert(!CanPrintStacktrace>); + +using FancyWcharStream = basic_ostream>; +static_assert(!CanPrintStacktrace); +static_assert(!CanPrintStacktrace>); +#endif // defined(__cpp_lib_concepts) + [[maybe_unused]] const int base_line = __LINE__; // Note: the below assumes that tail call optimization is disabled, which is the case in /Od