blob: b3f11973dbc5fdf0835b3b1b1f0efb8586a5b663 [file] [log] [blame]
/* structured bindings */
#include <array>
#include <tuple>
#include "target-flex-common.h"
template<typename Array, typename Tuple, typename Struct>
bool test(Array array, Tuple tuple, Struct s)
{
bool ok;
auto array_2nd_in = std::get<2>(array);
auto tuple_2nd_in = std::get<2>(tuple);
auto s_2nd_in = s._2;
decltype(array_2nd_in) array_2nd_out_0;
decltype(tuple_2nd_in) tuple_2nd_out_0;
decltype(s_2nd_in) s_2nd_out_0;
decltype(array_2nd_in) array_2nd_out_1;
decltype(tuple_2nd_in) tuple_2nd_out_1;
decltype(s_2nd_in) s_2nd_out_1;
decltype(array_2nd_in) array_2nd_out_2;
decltype(tuple_2nd_in) tuple_2nd_out_2;
decltype(s_2nd_in) s_2nd_out_2;
#pragma omp target map(from: ok, \
array_2nd_out_0, tuple_2nd_out_0, s_2nd_out_0, \
array_2nd_out_1, tuple_2nd_out_1, s_2nd_out_1, \
array_2nd_out_2, tuple_2nd_out_2, s_2nd_out_2) \
map(to: array_2nd_in, tuple_2nd_in, s_2nd_in, array, tuple, s)
{
bool inner_ok = true;
{
{
auto [array_0th, array_1st, array_2nd] = array;
VERIFY (array_2nd_in == array_2nd);
VERIFY (std::get<2>(array) == array_2nd);
array_2nd_out_0 = array_2nd;
auto [tuple_0th, tuple_1st, tuple_2nd] = tuple;
VERIFY (tuple_2nd_in == tuple_2nd);
VERIFY (std::get<2>(tuple) == tuple_2nd);
tuple_2nd_out_0 = tuple_2nd;
auto [s_0th, s_1st, s_2nd] = s;
VERIFY (s_2nd_in == s_2nd);
VERIFY (s._2 == s_2nd);
s_2nd_out_0 = s_2nd;
}
{
auto& [array_0th, array_1st, array_2nd] = array;
VERIFY (array_2nd_in == array_2nd);
VERIFY (std::get<2>(array) == array_2nd);
array_2nd_out_1 = array_2nd;
auto& [tuple_0th, tuple_1st, tuple_2nd] = tuple;
VERIFY (tuple_2nd_in == tuple_2nd);
VERIFY (std::get<2>(tuple) == tuple_2nd);
tuple_2nd_out_1 = tuple_2nd;
auto& [s_0th, s_1st, s_2nd] = s;
VERIFY (s_2nd_in == s_2nd);
VERIFY (s._2 == s_2nd);
s_2nd_out_1 = s_2nd;
}
{
const auto& [array_0th, array_1st, array_2nd] = array;
VERIFY (array_2nd_in == array_2nd);
VERIFY (std::get<2>(array) == array_2nd);
array_2nd_out_2 = array_2nd;
const auto& [tuple_0th, tuple_1st, tuple_2nd] = tuple;
VERIFY (tuple_2nd_in == tuple_2nd);
VERIFY (std::get<2>(tuple) == tuple_2nd);
tuple_2nd_out_2 = tuple_2nd;
const auto& [s_0th, s_1st, s_2nd] = s;
VERIFY (s_2nd_in == s_2nd);
VERIFY (s._2 == s_2nd);
s_2nd_out_2 = s_2nd;
}
}
end:
ok = inner_ok;
}
if (!ok)
return false;
VERIFY_NON_TARGET (array_2nd_out_0 == array_2nd_in);
VERIFY_NON_TARGET (tuple_2nd_out_0 == tuple_2nd_in);
VERIFY_NON_TARGET (s_2nd_out_0 == s_2nd_in);
VERIFY_NON_TARGET (array_2nd_out_1 == array_2nd_in);
VERIFY_NON_TARGET (tuple_2nd_out_1 == tuple_2nd_in);
VERIFY_NON_TARGET (s_2nd_out_1 == s_2nd_in);
VERIFY_NON_TARGET (array_2nd_out_2 == array_2nd_in);
VERIFY_NON_TARGET (tuple_2nd_out_2 == tuple_2nd_in);
VERIFY_NON_TARGET (s_2nd_out_2 == s_2nd_in);
return true;
}
struct S
{
char _0;
float _1;
int _2;
};
int main()
{
const bool test_res
= test(std::array{0, 1, 2},
std::tuple{'a', 3.14f, 42},
S{'a', 3.14f, 42});
return test_res ? 0 : 1;
}