1*3412bc76SHristo Hristov //===----------------------------------------------------------------------===// 2*3412bc76SHristo Hristov // 3*3412bc76SHristo Hristov // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*3412bc76SHristo Hristov // See https://llvm.org/LICENSE.txt for license information. 5*3412bc76SHristo Hristov // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*3412bc76SHristo Hristov // 7*3412bc76SHristo Hristov //===----------------------------------------------------------------------===// 8*3412bc76SHristo Hristov 9*3412bc76SHristo Hristov // UNSUPPORTED: c++03, c++11, c++14, c++17, c++20, c++23 10*3412bc76SHristo Hristov // XFAIL: apple-clang 11*3412bc76SHristo Hristov 12*3412bc76SHristo Hristov // <variant> 13*3412bc76SHristo Hristov 14*3412bc76SHristo Hristov // class variant; 15*3412bc76SHristo Hristov // template<class Self, class Visitor> 16*3412bc76SHristo Hristov // constexpr decltype(auto) visit(this Self&&, Visitor&&); // since C++26 17*3412bc76SHristo Hristov // template<class R, class Self, class Visitor> 18*3412bc76SHristo Hristov // constexpr R visit(this Self&&, Visitor&&); // since C++26 19*3412bc76SHristo Hristov 20*3412bc76SHristo Hristov #include <variant> 21*3412bc76SHristo Hristov 22*3412bc76SHristo Hristov #include "test_macros.h" 23*3412bc76SHristo Hristov 24*3412bc76SHristo Hristov struct Incomplete; 25*3412bc76SHristo Hristov template <class T> 26*3412bc76SHristo Hristov struct Holder { 27*3412bc76SHristo Hristov T t; 28*3412bc76SHristo Hristov }; 29*3412bc76SHristo Hristov 30*3412bc76SHristo Hristov constexpr bool test(bool do_it) { 31*3412bc76SHristo Hristov if (do_it) { 32*3412bc76SHristo Hristov std::variant<Holder<Incomplete>*, int> v = nullptr; 33*3412bc76SHristo Hristov 34*3412bc76SHristo Hristov v.visit([](auto) {}); 35*3412bc76SHristo Hristov v.visit([](auto) -> Holder<Incomplete>* { return nullptr; }); 36*3412bc76SHristo Hristov v.visit<void>([](auto) {}); 37*3412bc76SHristo Hristov v.visit<void*>([](auto) -> Holder<Incomplete>* { return nullptr; }); 38*3412bc76SHristo Hristov } 39*3412bc76SHristo Hristov return true; 40*3412bc76SHristo Hristov } 41*3412bc76SHristo Hristov 42*3412bc76SHristo Hristov int main(int, char**) { 43*3412bc76SHristo Hristov test(true); 44*3412bc76SHristo Hristov static_assert(test(true)); 45*3412bc76SHristo Hristov 46*3412bc76SHristo Hristov return 0; 47*3412bc76SHristo Hristov } 48