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