/* PR middle-end/109816 */ /* This variant: without -flto, see target-map-class-2.C for -flto. */ /* iostream.h adds 'globl _ZSt21ios_base_library_initv' with _GLIBCXX_SYMVER_GNU, but it shouldn't end up in the offload assembly but only in the host assembly. */ /* Example based on sollve_vv's test_target_data_map_classes.cpp; however, relevant is only the 'include' and not the actual executable code. */ #include #include using namespace std; #define N 1000 struct A { int *h_array; int size, sum; A (int *array, const int s) : h_array(array), size(s), sum(0) { } ~A() { h_array = NULL; } }; void test_map_tofrom_class_heap () { int *array = new int[N]; A *obj = new A (array, N); #pragma omp target map(from: array[:N]) map(tofrom: obj[:1]) { int *tmp_h_array = obj->h_array; obj->h_array = array; int tmp = 0; for (int i = 0; i < N; ++i) { obj->h_array[i] = 4*i; tmp += 3; } obj->h_array = tmp_h_array; obj->sum = tmp; } for (int i = 0; i < N; ++i) if (obj->h_array[i] != 4*i) __builtin_abort (); if (3*N != obj->sum) { std::cout << "sum: " << obj->sum << std::endl; __builtin_abort (); } delete obj; delete[] array; } void test_map_tofrom_class_stack () { int array[N]; A obj(array, N); #pragma omp target map(from: array[:N]) map(tofrom: obj) { int *tmp_h_array = obj.h_array; obj.h_array = array; int tmp = 0; for (int i = 0; i < N; ++i) { obj.h_array[i] = 7*i; tmp += 5; } obj.h_array = tmp_h_array; obj.sum = tmp; } for (int i = 0; i < N; ++i) if (obj.h_array[i] != 7*i) __builtin_abort (); if (5*N != obj.sum) { std::cout << "sum: " << obj.sum << std::endl; __builtin_abort (); } } int main() { test_map_tofrom_class_heap(); test_map_tofrom_class_stack(); return 0; }