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