]>
git.ipfire.org Git - thirdparty/gcc.git/blob - libstdc++-v3/testsuite/20_util/variant/visit.cc
ebe0344b58582424d1861d5e8993dba43dede39f
1 // Copyright (C) 2019-2021 Free Software Foundation, Inc.
3 // This file is part of the GNU ISO C++ Library. This library is free
4 // software; you can redistribute it and/or modify it under the
5 // terms of the GNU General Public License as published by the
6 // Free Software Foundation; either version 3, or (at your option)
9 // This library is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
14 // You should have received a copy of the GNU General Public License along
15 // with this library; see the file COPYING3. If not see
16 // <http://www.gnu.org/licenses/>.
18 // { dg-options "-std=gnu++17" }
19 // { dg-do run { target c++17 } }
23 #include <testsuite_hooks.h>
25 // N.B. there are more std::visit tests in ./compile.cc and ./run.cc
30 // Verify that visitation uses INVOKE and supports arbitrary callables.
34 int sum(int i
) const { return i
+ n
; }
35 int product(int i
) const { return i
* n
; }
39 std::variant
<X
, X
*, std::reference_wrapper
<X
>> vobj
{X
{1}};
40 int res
= std::visit(&X::n
, vobj
);
43 std::variant
<int, short> varg
{2};
44 res
= std::visit(&X::sum
, vobj
, varg
);
49 res
= std::visit(&X::n
, vobj
);
52 varg
.emplace
<short>(5);
53 res
= std::visit(&X::sum
, vobj
, varg
);
57 res
= std::visit(&X::product
, vobj
, varg
);
62 res
= std::visit(&X::n
, vobj
);
65 res
= std::visit(&X::product
, vobj
, varg
);
75 NoCopy(const NoCopy
&) = delete;
76 NoCopy(NoCopy
&&) = delete;
79 int operator()(int i
) { return i
; }
80 int operator()(const NoCopy
&) { return 0; }
83 std::variant
<NoCopy
, int> v
{1};
85 // Visit should not need arguments to be copyable:
86 int res
= std::visit(f
, v
);