aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/c-c++-common/gomp/interop-3.c
blob: 38d7f658ac2878b01efe2fae9be84b449ccd5bb6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
/* The following definitions are in omp_lib, which cannot be included
   in gcc/testsuite/  */

#if __cplusplus >= 201103L
# define __GOMP_UINTPTR_T_ENUM : __UINTPTR_TYPE__
#else
# define __GOMP_UINTPTR_T_ENUM
#endif

typedef enum omp_interop_t __GOMP_UINTPTR_T_ENUM
{
  omp_interop_none = 0,
  __omp_interop_t_max__ = __UINTPTR_MAX__
} omp_interop_t;

typedef enum omp_interop_fr_t
{
  omp_ifr_cuda = 1,
  omp_ifr_cuda_driver = 2,
  omp_ifr_opencl = 3,
  omp_ifr_sycl = 4,
  omp_ifr_hip = 5,
  omp_ifr_level_zero = 6,
  omp_ifr_hsa = 7,
  omp_ifr_last = omp_ifr_hsa
} omp_interop_fr_t;


// ---------------------------------

void f()
{
  omp_interop_t obj1, obj2, obj3, obj4, obj5;
  omp_interop_t target, targetsync, prefer_type;
  int x;

#pragma omp interop init(target: obj1) init(target,targetsync : obj2, obj3) nowait

  #pragma omp interop init(prefer_type("cuda", omp_ifr_opencl, omp_ifr_level_zero, "hsa"), targetsync : obj1) \
                      destroy(obj2, obj3) depend(inout: x) use(obj4, obj5) device(device_num: 0)

  #pragma omp assume contains(interop)
    {
  #pragma omp interop init(prefer_type("cu da"), targetsync : obj3)  // { dg-warning "unknown foreign runtime identifier 'cu da'" }
    }

  #pragma omp interop init(target: obj1, obj2, obj1), use(obj4) destroy(obj4)
  // { dg-error "'obj4' appears more than once in action clauses" "" { target *-*-* } .-1 }
  // { dg-error "'obj1' appears more than once in action clauses" "" { target *-*-* } .-2 }

  #pragma omp interop depend(inout: x)  // { dg-error "'depend' clause requires action clauses with 'targetsync' interop-type" }

  #pragma omp interop depend(inout: x) , use(obj2), destroy(obj3) //  OK, use or destroy might have 'targetsync'

  #pragma omp interop depend(inout: x) use(obj2), destroy(obj3) //  Likewise

  #pragma omp interop depend(inout: x) use(obj2), destroy(obj3) init(target: obj4) // { dg-error "'depend' clause requires action clauses with 'targetsync' interop-type" }
  // { dg-note "69: 'init' clause lacks the 'targetsync' modifier" "" { target c } .-1 }
  // { dg-note "78: 'init' clause lacks the 'targetsync' modifier" "" { target c++ } .-2 }

  #pragma omp interop depend(inout: x) init(targetsync : obj5)  use(obj2), destroy(obj3) init(target : obj4) // { dg-error "'depend' clause requires action clauses with 'targetsync' interop-type" }
  // { dg-note "'init' clause lacks the 'targetsync' modifier" "" { target *-*-* } .-1 }
  #pragma omp interop depend(inout: x) init(targetsync : obj5)  use(obj2), destroy(obj3) init(prefer_type("cuda"), targetsync : obj4) // OK

  #pragma omp interop init(target, targetsync, prefer_type, obj1) // { dg-error "59: expected '\\(' before ',' token" }
  #pragma omp interop init(prefer_type, obj1, target, targetsync) // { dg-error "39: expected '\\(' before ',' token" }

// Duplicated variable name or duplicated modifier:
  #pragma omp interop init(target, targetsync,target : obj1)  // { dg-error "duplicate 'target' modifier" }
#pragma omp interop init(target, targetsync,target: obj1)     // { dg-error "duplicate 'target' modifier" }
  #pragma omp interop init(target : target, targetsync,target)  // { dg-error "'target' appears more than once in action clauses" }

  #pragma omp interop init(, targetsync, prefer_type, obj1, target)   // { dg-error "expected 'prefer_type', 'target', or 'targetsync'" }
}