xref: /llvm-project/libcxx/test/std/utilities/variant/variant.visit.member/robust_against_adl.pass.cpp (revision 7f845cba2ccc2ab637b8e40fbafb9f83a2d67c70)
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