================ @@ -0,0 +1,357 @@ +//===----------------------------------------------------------------------===// +// +// 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 +// The tested functionality needs deducing this. +// UNSUPPORTED: clang-16 || clang-17 || apple-clang + +// <variant> + +// class variant; + +// template<class R, class Self, class Visitor> +// constexpr R visit(this Self&&, Visitor&&); // since C++26 + +#include <cassert> +#include <memory> +#include <string> +#include <type_traits> +#include <utility> +#include <variant> + +#include "test_macros.h" +#include "variant_test_helpers.h" + +template <class... Ts> +struct overloaded : Ts... { + using Ts::operator()...; +}; + +void test_overload_ambiguity() { + using V = std::variant<float, long, std::string>; + using namespace std::string_literals; + V v{"baba"s}; + + v.visit( + overloaded{[]([[maybe_unused]] auto x) { assert(false); }, [](const std::string& x) { assert(x == "baba"s); }}); + assert(std::get<std::string>(v) == "baba"s); + + // Test the constraint. + v = std::move(v).visit<V>(overloaded{ + []([[maybe_unused]] auto x) { + assert(false); + return 0; + }, + [](const std::string& x) { + assert(x == "baba"s); + return x + " zmt"s; + }}); + assert(std::get<std::string>(v) == "baba zmt"s); +} + +template <typename ReturnType> +void test_call_operator_forwarding() { + using Fn = ForwardingCallObject; + Fn obj{}; + const Fn& cobj = obj; + + { // test call operator forwarding - no variant + // non-member + { + std::visit<ReturnType>(obj); + assert(Fn::check_call<>(CT_NonConst | CT_LValue)); + std::visit<ReturnType>(cobj); + assert(Fn::check_call<>(CT_Const | CT_LValue)); + std::visit<ReturnType>(std::move(obj)); + assert(Fn::check_call<>(CT_NonConst | CT_RValue)); + std::visit<ReturnType>(std::move(cobj)); + assert(Fn::check_call<>(CT_Const | CT_RValue)); + } ---------------- H-G-Hristov wrote:
Good catch! Thank you! 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