blob: 32c6931e9a8009fa196a6658d82d6f1234dfe9ac [file] [log] [blame]
// { dg-do run { target c++26 } }
#include <functional>
#include <testsuite_hooks.h>
using std::nontype;
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(nontype<&S::x>, s);
function_ref<long()> r2(nontype<&S::x>, &s);
VERIFY( r1() == 10 );
VERIFY( r2() == 10 );
s.x = 20;
VERIFY( r1() == 20 );
VERIFY( r2() == 20 );
r1 = function_ref<int()>(nontype<&S::f>, &s);
r2 = function_ref<long()>(nontype<&S::f>, s);
VERIFY( r1() == 20 );
VERIFY( r2() == 20 );
s.x = 30;
VERIFY( r1() == 30 );
VERIFY( r2() == 30 );
}
int main()
{
test01();
test02();
}