1 // RUN: %clang_cc1 -verify -fopenmp -triple x86_64-unknown-linux-gnu -x c -std=c99 -ast-print %s -o - | FileCheck %s
2 
3 // RUN: %clang_cc1 -verify -fopenmp-simd -triple x86_64-unknown-linux-gnu -x c -std=c99 -ast-print %s -o - | FileCheck %s
4 // expected-no-diagnostics
5 
6 #ifndef HEADER
7 #define HEADER
8 
9 void bar(void);
10 
11 #define N 10
foo(void)12 void foo(void) {
13 #pragma omp metadirective when(device = {kind(cpu)} \
14                                : parallel) default()
15   bar();
16 #pragma omp metadirective when(implementation = {vendor(score(0)  \
17                                                         : llvm)}, \
18                                device = {kind(cpu)}               \
19                                : parallel) default(target teams)
20   bar();
21 #pragma omp metadirective when(device = {kind(gpu)}                                 \
22                                : target teams) when(implementation = {vendor(llvm)} \
23                                                     : parallel) default()
24   bar();
25 #pragma omp metadirective default(target) when(implementation = {vendor(score(5)  \
26                                                                         : llvm)}, \
27                                                device = {kind(cpu, host)}         \
28                                                : parallel)
29   bar();
30 #pragma omp metadirective when(user = {condition(N > 10)}                 \
31                                : target) when(user = {condition(N == 10)} \
32                                               : parallel)
33   bar();
34 #pragma omp metadirective when(device = {kind(host)} \
35                                : parallel for)
36   for (int i = 0; i < 100; i++)
37     ;
38 #pragma omp metadirective when(implementation = {extension(match_all)} \
39                                : parallel) default(parallel for)
40   for (int i = 0; i < 100; i++)
41     ;
42 #pragma omp metadirective when(implementation = {extension(match_any)} \
43                                : parallel) default(parallel for)
44   for (int i = 0; i < 100; i++)
45     ;
46 #pragma omp metadirective when(implementation = {extension(match_none)} \
47                                : parallel) default(parallel for)
48   for (int i = 0; i < 100; i++)
49     ;
50 }
51 
52 // CHECK: void bar();
53 // CHECK: void foo()
54 // CHECK-NEXT: #pragma omp parallel
55 // CHECK-NEXT: bar()
56 // CHECK-NEXT: #pragma omp parallel
57 // CHECK-NEXT: bar()
58 // CHECK-NEXT: #pragma omp parallel
59 // CHECK-NEXT: bar()
60 // CHECK-NEXT: #pragma omp parallel
61 // CHECK-NEXT: bar()
62 // CHECK-NEXT: #pragma omp parallel
63 // CHECK-NEXT: bar()
64 // CHECK-NEXT: #pragma omp parallel for
65 // CHECK-NEXT: for (int i = 0; i < 100; i++)
66 // CHECK: #pragma omp parallel
67 // CHECK-NEXT: for (int i = 0; i < 100; i++)
68 // CHECK: #pragma omp parallel for
69 // CHECK-NEXT: for (int i = 0; i < 100; i++)
70 // CHECK: #pragma omp parallel
71 // CHECK-NEXT: for (int i = 0; i < 100; i++)
72 
73 #endif
74