| // 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); | |
| } |