[Lldb-commits] [llvm] [clang-tools-extra] [libcxx] [flang] [compiler-rt] [libc] [clang] [lldb] [libc++][variant] P2637R3: Member `visit` (`std::variant`) (PR #76447)
https://github.com/mordante edited https://github.com/llvm/llvm-project/pull/76447 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [llvm] [clang] [compiler-rt] [clang-tools-extra] [flang] [libc] [libcxx] [lldb] [libc++][variant] P2637R3: Member `visit` (`std::variant`) (PR #76447)
https://github.com/mordante requested changes to this pull request. Thanks for working on this! https://github.com/llvm/llvm-project/pull/76447 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [llvm] [clang-tools-extra] [libcxx] [compiler-rt] [libc] [flang] [lldb] [clang] [libc++][variant] P2637R3: Member `visit` (`std::variant`) (PR #76447)
@@ -40,6 +40,8 @@ Paper Status .. note:: .. [#note-P2510R3] This paper is applied as DR against C++20. (MSVC STL and libstdc++ will do the same.) + .. [#note-P2637R3] P2637R3: Implemented `variant` member `visit` mordante wrote: Since we have both patches under review I don't mind to strongly about this note. It's more important when there a no other patches. (However I don't object.) https://github.com/llvm/llvm-project/pull/76447 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [libc] [llvm] [libcxx] [clang-tools-extra] [flang] [clang] [lldb] [compiler-rt] [libc++][variant] P2637R3: Member `visit` (`std::variant`) (PR #76447)
@@ -0,0 +1,268 @@ +//===--===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===--===// + +// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20, c++23 + +// + +// class variant; + +// template +// constexpr decltype(auto) visit(this Self&&, Visitor&&); // since C++26 + +#include +#include +#include +#include +#include +#include + +#include "test_macros.h" +#include "variant_test_helpers.h" + +void test_call_operator_forwarding() { + using Fn = ForwardingCallObject; + Fn obj{}; + const Fn& cobj = obj; + + { // test call operator forwarding - no variant +// non-member +{ + std::visit(obj); + assert(Fn::check_call<>(CT_NonConst | CT_LValue)); + std::visit(cobj); + assert(Fn::check_call<>(CT_Const | CT_LValue)); + std::visit(std::move(obj)); + assert(Fn::check_call<>(CT_NonConst | CT_RValue)); + std::visit(std::move(cobj)); + assert(Fn::check_call<>(CT_Const | CT_RValue)); +} + } + { // test call operator forwarding - single variant, single arg +using V = std::variant; +V v(42); + +v.visit(obj); +assert(Fn::check_call(CT_NonConst | CT_LValue)); +v.visit(cobj); +assert(Fn::check_call(CT_Const | CT_LValue)); +v.visit(std::move(obj)); +assert(Fn::check_call(CT_NonConst | CT_RValue)); +v.visit(std::move(cobj)); +assert(Fn::check_call(CT_Const | CT_RValue)); + } + { // test call operator forwarding - single variant, multi arg +using V = std::variant; +V v(42L); + +v.visit(obj); +assert(Fn::check_call(CT_NonConst | CT_LValue)); +v.visit(cobj); +assert(Fn::check_call(CT_Const | CT_LValue)); +v.visit(std::move(obj)); +assert(Fn::check_call(CT_NonConst | CT_RValue)); +v.visit(std::move(cobj)); +assert(Fn::check_call(CT_Const | CT_RValue)); + } +} + +// Applies to non-member `std::visit` only. +void test_argument_forwarding() { + using Fn = ForwardingCallObject; + Fn obj{}; + const auto val = CT_LValue | CT_NonConst; + + { // single argument - value type +using V = std::variant; +V v(42); +const V& cv = v; + +v.visit(obj); +assert(Fn::check_call(val)); +cv.visit(obj); +assert(Fn::check_call(val)); +std::move(v).visit(obj); +assert(Fn::check_call(val)); +std::move(cv).visit(obj); +assert(Fn::check_call(val)); + } +#if !defined(TEST_VARIANT_HAS_NO_REFERENCES) + { // single argument - lvalue reference +using V = std::variant; +int x = 42; +V v(x); +const V& cv = v; + +v.visit(obj); +assert(Fn::check_call(val)); +cv.visit(obj); +assert(Fn::check_call(val)); +std::move(v).visit(obj); +assert(Fn::check_call(val)); +std::move(cv).visit(obj); +assert(Fn::check_call(val)); +assert(false); + } + { // single argument - rvalue reference +using V = std::variant; +int x = 42; +V v(std::move(x)); +const V& cv = v; + +v.visit(obj); +assert(Fn::check_call(val)); +cvstd::visit(obj); +assert(Fn::check_call(val)); +std::move(v).visit(obj); +assert(Fn::check_call(val)); +std::move(cv).visit(obj); +assert(Fn::check_call(val)); + } +#endif +} + +void test_return_type() { + using Fn = ForwardingCallObject; + Fn obj{}; + const Fn& cobj = obj; + + { // test call operator forwarding - single variant, single arg +using V = std::variant; +V v(42); + +static_assert(std::is_same_v); +static_assert(std::is_same_v); +static_assert(std::is_same_v); +static_assert(std::is_same_v); + } + { // test call operator forwarding - single variant, multi arg +using V = std::variant; +V v(42L); + +static_assert(std::is_same_v); +static_assert(std::is_same_v); +static_assert(std::is_same_v); +static_assert(std::is_same_v); + } +} + +void test_constexpr() { + constexpr ReturnFirst obj{}; + + { +using V = std::variant; +constexpr V v(42); + +static_assert(v.visit(obj) == 42); + } + { +using V = std::variant; +constexpr V v(42L); + +static_assert(v.visit(obj) == 42); + } +} + +void test_exceptions() { +#ifndef TEST_HAS_NO_EXCEPTIONS + ReturnArity obj{}; + + auto test = [&](auto&& v) { +try { + v.visit(obj); +} catch (const std::bad_variant_access&) { + return true; +} catch (...) { +} +return false; + }; + + { +using V = std::variant; +V v; +makeEmpty(v); + +assert(test(v)); + } +#endif +} + +// See https://llvm.org/PR31916 +void test_caller_accepts_nonconst() { + struct A {}; + struct Visitor { +void operator()(A&) {} + }; + std::variant v; + + v.visit(Visitor{}); +} + +struct MyVariant : std::variant {}; + +n
[Lldb-commits] [libc] [clang] [clang-tools-extra] [libcxx] [compiler-rt] [lldb] [llvm] [flang] [libc++][variant] P2637R3: Member `visit` (`std::variant`) (PR #76447)
@@ -69,6 +69,12 @@ namespace std { // 20.7.2.6, swap void swap(variant&) noexcept(see below); + +// [variant.visit], visitation +template + constexpr decltype(auto) visit(this Self&&, Visitor&&); +template + constexpr R visit(this Self&&, Visitor&&); mordante wrote: ```suggestion template constexpr decltype(auto) visit(this Self&&, Visitor&&);// Since C++26 template constexpr R visit(this Self&&, Visitor&&); // Since C++26 ``` https://github.com/llvm/llvm-project/pull/76447 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [llvm] [compiler-rt] [libc] [clang] [libcxx] [flang] [clang-tools-extra] [lldb] [libc++][variant] P2637R3: Member `visit` (`std::variant`) (PR #76447)
@@ -17,27 +17,28 @@ #include "test_macros.h" struct Incomplete; -template struct Holder { T t; }; mordante wrote: For this file too. https://github.com/llvm/llvm-project/pull/76447 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [libcxx] [llvm] [libc] [lldb] [compiler-rt] [clang-tools-extra] [clang] [flang] [libc++][variant] P2637R3: Member `visit` (`std::variant`) (PR #76447)
@@ -26,7 +26,7 @@ template void test_call_operator_forwarding() { using Fn = ForwardingCallObject; Fn obj{}; - const Fn &cobj = obj; mordante wrote: Please undo the formatting changes to this file. It's hard to see what really changed. https://github.com/llvm/llvm-project/pull/76447 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [flang] [clang] [lldb] [libc] [libcxx] [llvm] [compiler-rt] [clang-tools-extra] [libc++][variant] P2637R3: Member `visit` (`std::variant`) (PR #76447)
@@ -0,0 +1,268 @@ +//===--===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===--===// + +// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20, c++23 + +// + +// class variant; + +// template +// constexpr decltype(auto) visit(this Self&&, Visitor&&); // since C++26 + +#include +#include +#include +#include +#include +#include + +#include "test_macros.h" +#include "variant_test_helpers.h" + +void test_call_operator_forwarding() { + using Fn = ForwardingCallObject; + Fn obj{}; + const Fn& cobj = obj; + + { // test call operator forwarding - no variant +// non-member +{ + std::visit(obj); + assert(Fn::check_call<>(CT_NonConst | CT_LValue)); mordante wrote: I assume this code is copied from somewhere else. I find it quite hard to read what is tested here. https://github.com/llvm/llvm-project/pull/76447 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [flang] [llvm] [lldb] [compiler-rt] [clang-tools-extra] [libc] [clang] [libcxx] [libc++][variant] P2637R3: Member `visit` (`std::variant`) (PR #76447)
@@ -1273,6 +1280,15 @@ public: __impl_.__swap(__that.__impl_); } +# if _LIBCPP_STD_VER >= 26 + // [variant.visit], visitation + template + constexpr decltype(auto) visit(this _Self&& __self, _Visitor&& __visitor); mordante wrote: nowadays we prefer to write the body in the class. https://github.com/llvm/llvm-project/pull/76447 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [clang-tools-extra] [libc] [llvm] [flang] [lldb] [libcxx] [clang] [compiler-rt] [libc++][variant] P2637R3: Member `visit` (`std::variant`) (PR #76447)
https://github.com/H-G-Hristov edited https://github.com/llvm/llvm-project/pull/76447 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [libcxx] [flang] [clang-tools-extra] [llvm] [libc] [clang] [lldb] [compiler-rt] [libc++][variant] P2637R3: Member `visit` (`std::variant`) (PR #76447)
@@ -26,7 +26,7 @@ template void test_call_operator_forwarding() { using Fn = ForwardingCallObject; Fn obj{}; - const Fn &cobj = obj; Zingam wrote: The reason for reformatting both files is that the CI format check failed for nearly every line in the previous commit: https://github.com/llvm/llvm-project/actions/runs/7362740090/job/20041480045 https://github.com/llvm/llvm-project/pull/76447 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits