1 // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm-bc %s -o %t-ppc-host.bc -fopenmp-version=50
2 // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple nvptx64-unknown-unknown -aux-triple powerpc64le-unknown-unknown -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - -fopenmp-version=50 | FileCheck %s --implicit-check-not='ret i32 {{1|81|84}}'
3 // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple nvptx64-unknown-unknown -aux-triple powerpc64le-unknown-unknown -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -emit-pch -o %t -fopenmp-version=50
4 // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple nvptx64-unknown-unknown -aux-triple powerpc64le-unknown-unknown -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -include-pch %t -o - -fopenmp-version=50 | FileCheck %s --implicit-check-not='ret i32 {{1|81|84}}'
5 // expected-no-diagnostics
6 
7 // CHECK-NOT: ret i32 {{1|81|84}}
8 // CHECK-DAG: define {{.*}}i32 @_Z3barv()
9 // CHECK-DAG: define {{.*}}i32 @_ZN16SpecSpecialFuncs6MethodEv(%struct.SpecSpecialFuncs* %{{.+}})
10 // CHECK-DAG: define {{.*}}i32 @_ZN12SpecialFuncs6MethodEv(%struct.SpecialFuncs* %{{.+}})
11 // CHECK-DAG: define linkonce_odr {{.*}}i32 @_ZN16SpecSpecialFuncs6methodEv(%struct.SpecSpecialFuncs* %{{.+}})
12 // CHECK-DAG: define linkonce_odr {{.*}}i32 @_ZN12SpecialFuncs6methodEv(%struct.SpecialFuncs* %{{.+}})
13 // CHECK-DAG: define {{.*}}i32 @_Z5prio_v()
14 // CHECK-DAG: define internal i32 @_ZL6prio1_v()
15 // CHECK-DAG: define {{.*}}i32 @_Z4callv()
16 // CHECK-DAG: define internal i32 @_ZL9stat_usedv()
17 // CHECK-DAG: define {{.*}}i32 @fn_linkage()
18 // CHECK-DAG: define {{.*}}i32 @_Z11fn_linkage1v()
19 
20 // CHECK-DAG: ret i32 2
21 // CHECK-DAG: ret i32 3
22 // CHECK-DAG: ret i32 4
23 // CHECK-DAG: ret i32 5
24 // CHECK-DAG: ret i32 6
25 // CHECK-DAG: ret i32 7
26 // CHECK-DAG: ret i32 82
27 // CHECK-DAG: ret i32 83
28 // CHECK-DAG: ret i32 85
29 // CHECK-DAG: ret i32 86
30 // CHECK-DAG: ret i32 87
31 
32 // Outputs for function members
33 // CHECK-DAG: ret i32 6
34 // CHECK-DAG: ret i32 7
35 // CHECK-NOT: ret i32 {{1|81|84}}
36 
37 #ifndef HEADER
38 #define HEADER
39 
40 int foo() { return 2; }
41 int bazzz();
42 int test();
43 static int stat_unused_();
44 static int stat_used_();
45 
46 #pragma omp declare target
47 
48 #pragma omp declare variant(foo) match(implementation = {vendor(llvm)})
49 int bar() { return 1; }
50 
51 #pragma omp declare variant(bazzz) match(implementation = {vendor(llvm)})
52 int baz() { return 1; }
53 
54 #pragma omp declare variant(test) match(implementation = {vendor(llvm)})
55 int call() { return 1; }
56 
57 #pragma omp declare variant(stat_unused_) match(implementation = {vendor(llvm)})
58 static int stat_unused() { return 1; }
59 
60 #pragma omp declare variant(stat_used_) match(implementation = {vendor(llvm)})
61 static int stat_used() { return 1; }
62 
63 #pragma omp end declare target
64 
65 int main() {
66   int res;
67 #pragma omp target map(from \
68                        : res)
69   res = bar() + baz() + call();
70   return res;
71 }
72 
73 int test() { return 3; }
74 static int stat_unused_() { return 4; }
75 static int stat_used_() { return 5; }
76 
77 #pragma omp declare target
78 
79 struct SpecialFuncs {
80   void vd() {}
81   SpecialFuncs();
82   ~SpecialFuncs();
83 
84   int method_() { return 6; }
85 #pragma omp declare variant(SpecialFuncs::method_) \
86     match(implementation = {vendor(llvm)})
87   int method() { return 1; }
88 #pragma omp declare variant(SpecialFuncs::method_) \
89     match(implementation = {vendor(llvm)})
90   int Method();
91 } s;
92 
93 int SpecialFuncs::Method() { return 1; }
94 
95 struct SpecSpecialFuncs {
96   void vd() {}
97   SpecSpecialFuncs();
98   ~SpecSpecialFuncs();
99 
100   int method_();
101 #pragma omp declare variant(SpecSpecialFuncs::method_) \
102     match(implementation = {vendor(llvm)})
103   int method() { return 1; }
104 #pragma omp declare variant(SpecSpecialFuncs::method_) \
105     match(implementation = {vendor(llvm)})
106   int Method();
107 } s1;
108 
109 #pragma omp end declare target
110 
111 int SpecSpecialFuncs::method_() { return 7; }
112 int SpecSpecialFuncs::Method() { return 1; }
113 
114 int prio() { return 81; }
115 int prio1() { return 82; }
116 static int prio2() { return 83; }
117 static int prio3() { return 84; }
118 static int prio4() { return 84; }
119 int fn_linkage_variant() { return 85; }
120 extern "C" int fn_linkage_variant1() { return 86; }
121 int fn_variant2() { return 1; }
122 
123 #pragma omp declare target
124 
125 void xxx() {
126   (void)s.method();
127   (void)s1.method();
128 }
129 
130 #pragma omp declare variant(prio) match(implementation = {vendor(llvm)})
131 #pragma omp declare variant(prio1) match(implementation = {vendor(score(1) \
132                                                                   : llvm)})
133 int prio_() { return 1; }
134 
135 #pragma omp declare variant(prio4) match(implementation = {vendor(score(3) \
136                                                                   : llvm)})
137 #pragma omp declare variant(prio2) match(implementation = {vendor(score(5) \
138                                                                   : llvm)})
139 #pragma omp declare variant(prio3) match(implementation = {vendor(score(1) \
140                                                                   : llvm)})
141 static int prio1_() { return 1; }
142 
143 int int_fn() { return prio1_(); }
144 
145 extern "C" {
146 #pragma omp declare variant(fn_linkage_variant) match(implementation = {vendor(llvm)})
147 int fn_linkage() { return 1; }
148 }
149 
150 #pragma omp declare variant(fn_linkage_variant1) match(implementation = {vendor(llvm)})
151 int fn_linkage1() { return 1; }
152 
153 #pragma omp declare variant(fn_variant2) match(implementation = {vendor(llvm, ibm)})
154 int fn2() { return 87; }
155 
156 #pragma omp end declare target
157 
158 #endif // HEADER
159