blob: d55f4facbda1334cfcdb0128a08026baedb3852e [file]
// { dg-do run { target c++26 } }
#include <functional>
#include <testsuite_hooks.h>
using std::function_ref;
void
test01()
{
struct F {
int v;
int operator()() { return v; }
};
F f1{2}, f2{5};
function_ref<int()> r1(f1);
function_ref<long()> r2(f1);
VERIFY( r1() == 2 );
VERIFY( r2() == 2 );
f1.v = 10;
VERIFY( r1() == 10 );
VERIFY( r2() == 10 );
r1 = function_ref<int()>(f2);
r2 = function_ref<long()>(f2);
VERIFY( r1() == 5 );
VERIFY( r2() == 5 );
f2.v = 13;
VERIFY( r1() == 13 );
VERIFY( r2() == 13 );
r1 = function_ref<int()>(f1);
r2 = function_ref<long()>(f1);
f1.v = 20;
VERIFY( r1() == 20 );
VERIFY( r2() == 20 );
}
void
test02()
{
struct S
{
int x;
int f() { return x; };
};
S s{10};
function_ref<int()> r1(std::cw<&S::x>, s);
function_ref<long()> r2(std::cw<&S::x>, &s);
VERIFY( r1() == 10 );
VERIFY( r2() == 10 );
s.x = 20;
VERIFY( r1() == 20 );
VERIFY( r2() == 20 );
r1 = function_ref<int()>(std::cw<&S::f>, &s);
r2 = function_ref<long()>(std::cw<&S::f>, s);
VERIFY( r1() == 20 );
VERIFY( r2() == 20 );
s.x = 30;
VERIFY( r1() == 30 );
VERIFY( r2() == 30 );
}
int main()
{
test01();
test02();
}