/* 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 <iostream>
#include <omp.h>

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