// RUN: %libomptarget-compile-generic -fopenmp-version=51 // RUN: %libomptarget-run-generic 2>&1 \ // RUN: | %fcheck-generic extern "C" int printf(const char *, ...); template class A { protected: T X; T Y; public: A(T x, T y) : X{x}, Y{y} {}; }; template class B : public A { using A::X; using A::Y; public: T res; B(T x, T y) : A(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 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); }