1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
/* 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;
}
|