// { dg-do compile { target c++11 } }

int n1 = 0, n2 = 42;
[[omp::sequence (directive (requires, atomic_default_mem_order (seq_cst)))]];
[[omp::directive (declare reduction (plus: int: omp_out += omp_in) initializer (omp_priv = 0))]];
int a;
[[omp::directive (declare target (a))]];
int t;
[[omp::sequence (omp::directive (threadprivate (t)))]];
int b, c, e;
[[omp::directive (declare target, to (b), link (c), enter (e))]];
[[omp::directive (declare target)]];
[[omp::directive (declare target)]];
int d;
[[omp::directive (end declare target)]];
[[omp::directive (end declare target)]];
[[omp::directive (nothing)]];
[[omp::directive (begin assumes no_openmp no_openmp_routines no_parallelism
				absent (atomic, barrier, cancel, cancellation point)
				absent (critical, depobj)
				absent (distribute, flush, loop, masked, master, nothing, ordered)
				absent (parallel, scan, scope, section, sections, simd, single, task)
				absent (taskgroup, taskloop, taskwait, taskyield)
				absent (target, teams, for, error) holds (n1 < n2))]];
void foo (void) {}
[[omp::directive (end assumes)]];
[[omp::directive (begin assumes, no_openmp, no_openmp_routines, no_parallelism,
				 absent (atomic, barrier, cancel, cancellation point),
				 absent (critical, depobj),
				 absent (distribute, flush, loop, masked, master, nothing, ordered),
				 absent (parallel, scan, scope, section, sections, simd, single, task),
				 absent (taskgroup, taskloop, taskwait, taskyield),
				 absent (target, teams, for, error), holds (n1 < n2))]];
[[omp::directive (begin assumes no_openmp)]];
void bar (void) {}
[[omp::sequence (omp::directive (end assumes), omp::directive (end assumes))]];
