// This testcase checks emission of debug info for threadprivate variables
// present in any clause of OpenMP construct.

// REQUIRES: x86-registered-target

// RUN: %clang_cc1 -debug-info-kind=constructor -x c -verify -triple x86_64-pc-linux-gnu -fopenmp -emit-llvm %s -o - | FileCheck %s
// expected-no-diagnostics

// CHECK: define internal void @main.omp_outlined_debug__(
// CHECK: call void @llvm.dbg.declare(metadata ptr %.global_tid..addr,
// CHECK: call void @llvm.dbg.declare(metadata ptr %.bound_tid..addr,
// CHECK: call void @llvm.dbg.declare(metadata ptr %nt.addr
// CHECK: store ptr %gbl_dynamic_int, ptr %gbl_dynamic_int.addr, align 8
// CHECK-NOT: call void @llvm.dbg.declare(metadata ptr %gbl_dynamic_int.addr
// CHECK-NOT: call void @llvm.dbg.declare(metadata ptr %gbl_static_int.addr

extern int printf(const char *, ...);
extern void omp_set_num_threads(int);
extern int omp_get_num_threads(void);
extern int omp_get_thread_num(void);

int gbl_dynamic_int;
__thread int gbl_static_int;

#pragma omp threadprivate(gbl_dynamic_int)

int main() {
  int nt = 0;
  int offset = 10;
  gbl_dynamic_int = 55;
  gbl_static_int = 77;

  omp_set_num_threads(4);
#pragma omp parallel copyin(gbl_dynamic_int, gbl_static_int)
  {
    int data;
    int tid;
    nt = omp_get_num_threads();
    tid = omp_get_thread_num();
    data = gbl_dynamic_int + gbl_static_int;
    gbl_dynamic_int += 10;
    gbl_static_int += 20;
#pragma omp barrier
    if (tid == 0)
      printf("In parallel region total threads = %d, thread id = %d data=%d gbl_dyn_addr = %p, gbl_static_addr = %p\n",
             nt, tid, data, &gbl_dynamic_int, &gbl_static_int);
    if (tid == 1)
      printf("In parallel region total threads = %d, thread id = %d data=%d gbl_dyn_addr = %p, gbl_static_addr = %p\n",
             nt, tid, data, &gbl_dynamic_int, &gbl_static_int);
    if (tid == 2)
      printf("In parallel region total threads = %d, thread id = %d data=%d gbl_dyn_addr = %p, gbl_static_addr = %p\n",
             nt, tid, data, &gbl_dynamic_int, &gbl_static_int);
    if (tid == 3)
      printf("In parallel region total threads = %d, thread id = %d data=%d gbl_dyn_addr = %p, gbl_static_addr = %p\n",
             nt, tid, data, &gbl_dynamic_int, &gbl_static_int);
  }

  return 0;
}
