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
|
// RUN: %libomptarget-compile-generic -fopenmp-version=51
// RUN: %libomptarget-run-generic 2>&1 \
// RUN: | %fcheck-generic
extern "C" int printf(const char *, ...);
template <typename T> class A {
protected:
T X;
T Y;
public:
A(T x, T y) : X{x}, Y{y} {};
};
template <typename T> class B : public A<T> {
using A<T>::X;
using A<T>::Y;
public:
T res;
B(T x, T y) : A<T>(x, y), res{0} {};
void run(void) {
#pragma omp target map(res)
{ res = X + Y; }
}
};
class X {
protected:
int A;
public:
X(int a) : A{a} {};
};
class Y : public X {
using X::A;
protected:
int B;
public:
Y(int a, int b) : X(a), B{b} {};
};
class Z : public Y {
using X::A;
using Y::B;
public:
int res;
Z(int a, int b) : Y(a, b), res{0} {};
void run(void) {
#pragma omp target map(res)
{ res = A + B; }
}
};
struct descriptor {
int A;
int C;
};
class BASE {};
class C : public BASE {
public:
void bar(descriptor &d) {
auto Asize = 4;
auto Csize = 4;
#pragma omp target data map(from : d.C)
{
#pragma omp target teams firstprivate(Csize)
d.C = 1;
}
#pragma omp target map(from : d.A)
d.A = 3;
}
};
int main(int argc, char *argv[]) {
B<int> b(2, 3);
b.run();
// CHECK: 5
printf("b.res = %d \n", b.res);
Z c(2, 3);
c.run();
// CHECK: 5
printf("c.res = %d \n", c.res);
descriptor d;
C z;
z.bar(d);
// CHECK 1
printf("%d\n", d.C);
// CHECK 3
printf("%d\n", d.A);
}
|