// RUN: %libomptarget-compile-run-and-check-generic
// UNSUPPORTED: intelgpu
// REQUIRES: gpu

#include <assert.h>
#include <omp.h>
#include <stdio.h>

#define TEST_VAL 5

#pragma omp declare target indirect
int direct(int x) { return 2 * x; }
int indirect_base(int x) { return -1 * x; }
#pragma omp end declare target

int (*indirect)(int) = indirect_base;

void set_indirect_func() { indirect = direct; }

void test_implicit_mapping() {
  int direct_res, indirect_res;

// Test with initial indirect function pointer (points to indirect_base)
#pragma omp target map(from : direct_res, indirect_res)
  {
    direct_res = direct(TEST_VAL);
    indirect_res = indirect(TEST_VAL);
  }

  assert(direct_res == TEST_VAL * 2 &&
         "Error: direct function returned invalid value");
  assert(indirect_res == TEST_VAL * -1 &&
         indirect_res == indirect_base(TEST_VAL) &&
         "Error: indirect function pointer did not return correct value");

  // Set indirect to point to direct function
  set_indirect_func();

// Test after setting indirect function pointer
#pragma omp target map(from : direct_res, indirect_res)
  {
    direct_res = direct(TEST_VAL);
    indirect_res = indirect(TEST_VAL);
  }

  assert(direct_res == TEST_VAL * 2 &&
         "Error: direct function returned invalid value");
  assert(indirect_res == direct_res &&
         "Error: indirect function pointer did not return correct value after "
         "being set");
}

void test_explicit_mapping() {
  // Reset indirect to initial state
  indirect = indirect_base;

  int direct_res, indirect_res;

// Test with initial indirect function pointer (points to indirect_base)
#pragma omp target map(indirect) map(from : direct_res, indirect_res)
  {
    direct_res = direct(TEST_VAL);
    indirect_res = indirect(TEST_VAL);
  }

  assert(direct_res == TEST_VAL * 2 &&
         "Error: direct function returned invalid value");
  assert(indirect_res == TEST_VAL * -1 &&
         indirect_res == indirect_base(TEST_VAL) &&
         "Error: indirect function pointer did not return correct value");

  // Set indirect to point to direct function
  set_indirect_func();

// Test after setting indirect function pointer
#pragma omp target map(indirect) map(from : direct_res, indirect_res)
  {
    direct_res = direct(TEST_VAL);
    indirect_res = indirect(TEST_VAL);
  }

  assert(direct_res == TEST_VAL * 2 &&
         "Error: direct function returned invalid value");
  assert(indirect_res == direct_res &&
         "Error: indirect function pointer did not return correct value after "
         "being set");
}

int main() {
  test_implicit_mapping();
  test_explicit_mapping();
  // CHECK: PASS
  printf("PASS\n");
  return 0;
}
