/* PR c++/110347 */

#include <omp.h>
#include <stdint.h>
#include <stdlib.h>

struct S {
  int A, B[10], *C;
  void f (int dev);
  void g (int dev);
};

template<typename T>
struct St {
  T A, B[10], *C;
  void ft (int dev);
  void gt (int dev);
};


void
S::f (int dev)
{
  A = 5;
  C = (int *) malloc (sizeof (int) * 10);
  uintptr_t c_saved = (uintptr_t) C;
  for (int i = 0; i < 10; i++)
    B[i] = C[i] = i+5;

  #pragma omp target private(A) private(B) private(C) device(dev)
    {
      A = 99;
      for (int i = 0; i < 10; i++)
	B[i] = -i-23;
      C = &A;
    }

  if (A != 5)
    abort ();
  if (c_saved != (uintptr_t) C)
    abort ();
  for (int i = 0; i < 10; i++)
    if (B[i] != i + 5 || C[i] != i+5)
      abort ();

  #pragma omp parallel if (0) private(A) private(B) private(C)
    {
      A = 99;
      for (int i = 0; i < 10; i++)
	B[i] = -i-23;
      C = &A;
    }

  if (A != 5)
    abort ();
  if (c_saved != (uintptr_t) C)
    abort ();
  for (int i = 0; i < 10; i++)
    if (B[i] != i + 5 || C[i] != i+5)
      abort ();

  free (C);
}

void
S::g (int dev)
{
  A = 5;
  C = (int *) malloc (sizeof (int) * 10);
  uintptr_t c_saved = (uintptr_t) C;
  for (int i = 0; i < 10; i++)
    B[i] = C[i] = i+5;

  #pragma omp target private(A) private(B) private(C) \
                     allocate(allocator(omp_low_lat_mem_alloc), align(128): A, B, C) \
                     device(dev)
    {
#if 0  /* FIXME: The following is disabled because of PR middle-end/113436.  */
      if (((uintptr_t) &A) % 128  != 0)
	abort ();
      if (((uintptr_t) &B) % 128  != 0)
	abort ();
      if (((uintptr_t) &C) % 128  != 0)
	abort ();
#endif
      A = 99;
      for (int i = 0; i < 10; i++)
	B[i] = -i-23;
      C = &A;
    }

  if (A != 5)
    abort ();
  if (c_saved != (uintptr_t) C)
    abort ();
  for (int i = 0; i < 10; i++)
    if (B[i] != i + 5 || C[i] != i+5)
      abort ();

  #pragma omp parallel if (0) private(A) private(B) private(C) \
                       allocate(allocator(omp_low_lat_mem_alloc), align(128): A, B, C)
    {
      if (((uintptr_t) &A) % 128  != 0)
	abort ();
      if (((uintptr_t) &B) % 128  != 0)
	abort ();
      if (((uintptr_t) &C) % 128  != 0)
	abort ();
      A = 99;
      for (int i = 0; i < 10; i++)
	B[i] = -i-23;
      C = &A;
    }

  if (A != 5)
    abort ();
  if (c_saved != (uintptr_t) C)
    abort ();
  for (int i = 0; i < 10; i++)
    if (B[i] != i + 5 || C[i] != i+5)
      abort ();

  free (C);
}


template<typename T>
void
St<T>::ft (int dev)
{
  A = 5;
  C = (T *) malloc (sizeof (T) * 10);
  uintptr_t c_saved = (uintptr_t) C;
  for (int i = 0; i < 10; i++)
    B[i] = C[i] = i+5;

  #pragma omp target private(A) private(B) private(C) device(dev)
    {
      A = 99;
      for (int i = 0; i < 10; i++)
	B[i] = -i-23;
      C = &A;
    }

  if (A != 5)
    abort ();
  if (c_saved != (uintptr_t) C)
    abort ();
  for (int i = 0; i < 10; i++)
    if (B[i] != i + 5 || C[i] != i+5)
      abort ();

  #pragma omp parallel if (0) private(A) private(B) private(C)
    {
      A = 99;
      for (int i = 0; i < 10; i++)
	B[i] = -i-23;
      C = &A;
    }

  if (A != 5)
    abort ();
  if (c_saved != (uintptr_t) C)
    abort ();
  for (int i = 0; i < 10; i++)
    if (B[i] != i + 5 || C[i] != i+5)
      abort ();

  free (C);
}

template<typename T>
void
St<T>::gt (int dev)
{
  A = 5;
  C = (T *) malloc (sizeof (T) * 10);
  uintptr_t c_saved = (uintptr_t) C;
  for (int i = 0; i < 10; i++)
    B[i] = C[i] = i+5;

  #pragma omp target private(A) private(B) private(C) \
                     allocate(allocator(omp_low_lat_mem_alloc), align(128): A, B, C) \
                     device(dev)
    {
#if 0  /* FIXME: The following is disabled because of PR middle-end/113436.  */
      if (((uintptr_t) &A) % 128  != 0)
	abort ();
      if (((uintptr_t) &B) % 128  != 0)
	abort ();
      if (((uintptr_t) &C) % 128  != 0)
	abort ();
#endif
      A = 99;
      for (int i = 0; i < 10; i++)
	B[i] = -i-23;
      C = &A;
    }

  if (A != 5)
    abort ();
  if (c_saved != (uintptr_t) C)
    abort ();
  for (int i = 0; i < 10; i++)
    if (B[i] != i + 5 || C[i] != i+5)
      abort ();

  #pragma omp parallel if (0) private(A) private(B) private(C) \
                       allocate(allocator(omp_low_lat_mem_alloc), align(128): A, B, C)
    {
      if (((uintptr_t) &A) % 128  != 0)
	abort ();
      if (((uintptr_t) &B) % 128  != 0)
	abort ();
      if (((uintptr_t) &C) % 128  != 0)
	abort ();
      A = 99;
      for (int i = 0; i < 10; i++)
	B[i] = -i-23;
      C = &A;
    }

  if (A != 5)
    abort ();
  if (c_saved != (uintptr_t) C)
    abort ();
  for (int i = 0; i < 10; i++)
    if (B[i] != i + 5 || C[i] != i+5)
      abort ();

  free (C);
}

int
main ()
{
  struct S s;
  struct St<int> st;
  for (int dev = 0; dev <= omp_get_num_devices(); dev++)
    {
      s.f (dev);
      st.ft (dev);
      s.g (dev);
      st.gt (dev);
    }
  return 0;
}
