1*ff260ad0SSaiyedul Islam // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm-bc %s -o %t-ppc-host.bc -DGPU
2*ff260ad0SSaiyedul Islam // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -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 - -DGPU | FileCheck %s --implicit-check-not='ret i32 {{6|7|9|10|12|14|17|18|20|21|22|23|24|26}}'
3*ff260ad0SSaiyedul Islam // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -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 -DGPU
4*ff260ad0SSaiyedul Islam // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -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 - -DGPU | FileCheck %s --implicit-check-not='ret i32 {{6|7|9|10|12|14|17|18|20|21|22|23|24|26}}'
54e8231b5SAlexey Bataev 
6*ff260ad0SSaiyedul Islam // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm-bc %s -o %t-ppc-host.bc -DNOHOST
7*ff260ad0SSaiyedul Islam // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -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 - -DNOHOST | FileCheck %s --implicit-check-not='ret i32 {{6|7|9|10|12|14|17|18|20|21|22|23|24|26}}'
8*ff260ad0SSaiyedul Islam // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -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 -DNOHOST
9*ff260ad0SSaiyedul Islam // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -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 - -DNOHOST | FileCheck %s --implicit-check-not='ret i32 {{6|7|9|10|12|14|17|18|20|21|22|23|24|26}}'
10*ff260ad0SSaiyedul Islam 
11*ff260ad0SSaiyedul Islam // 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 -DGPU
12*ff260ad0SSaiyedul Islam // 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 - -DGPU | FileCheck %s --implicit-check-not='ret i32 {{6|7|9|10|12|14|17|18|20|21|22|23|24|26}}'
13*ff260ad0SSaiyedul Islam // 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 -DGPU
14*ff260ad0SSaiyedul Islam // 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 - -DGPU | FileCheck %s --implicit-check-not='ret i32 {{6|7|9|10|12|14|17|18|20|21|22|23|24|26}}'
15*ff260ad0SSaiyedul Islam 
16*ff260ad0SSaiyedul Islam // 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 -DNOHOST
17*ff260ad0SSaiyedul Islam // 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 - -DNOHOST | FileCheck %s --implicit-check-not='ret i32 {{6|7|9|10|12|14|17|18|20|21|22|23|24|26}}'
18*ff260ad0SSaiyedul Islam // 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 -DNOHOST
19*ff260ad0SSaiyedul Islam // 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 - -DNOHOST | FileCheck %s --implicit-check-not='ret i32 {{6|7|9|10|12|14|17|18|20|21|22|23|24|26}}'
204e8231b5SAlexey Bataev // expected-no-diagnostics
214e8231b5SAlexey Bataev 
224e8231b5SAlexey Bataev // CHECK-DAG: ret i32 2
234e8231b5SAlexey Bataev // CHECK-DAG: ret i32 3
244e8231b5SAlexey Bataev // CHECK-DAG: ret i32 4
254e8231b5SAlexey Bataev // CHECK-DAG: ret i32 5
26befb4be3SJohannes Doerfert // CHECK-DAG: ret i32 8
27befb4be3SJohannes Doerfert // CHECK-DAG: ret i32 11
28befb4be3SJohannes Doerfert // CHECK-DAG: ret i32 13
29befb4be3SJohannes Doerfert // CHECK-DAG: ret i32 15
30befb4be3SJohannes Doerfert // CHECK-DAG: ret i32 16
31befb4be3SJohannes Doerfert // CHECK-DAG: ret i32 19
32befb4be3SJohannes Doerfert // CHECK-DAG: ret i32 25
334e8231b5SAlexey Bataev 
34befb4be3SJohannes Doerfert // Outputs for function members checked via implicit filecheck flag
35befb4be3SJohannes Doerfert 
364e8231b5SAlexey Bataev 
374e8231b5SAlexey Bataev #ifndef HEADER
384e8231b5SAlexey Bataev #define HEADER
394e8231b5SAlexey Bataev 
404e8231b5SAlexey Bataev #ifdef GPU
411228d42dSJohannes Doerfert #define SUBSET gpu
421228d42dSJohannes Doerfert #define CORRECT nohost, gpu
434e8231b5SAlexey Bataev #define WRONG cpu, gpu
444e8231b5SAlexey Bataev #endif // GPU
454e8231b5SAlexey Bataev #ifdef NOHOST
461228d42dSJohannes Doerfert #define SUBSET nohost
471228d42dSJohannes Doerfert #define CORRECT nohost, gpu
484e8231b5SAlexey Bataev #define WRONG nohost, host
494e8231b5SAlexey Bataev #endif // NOHOST
504e8231b5SAlexey Bataev 
foo()514e8231b5SAlexey Bataev int foo() { return 2; }
524e8231b5SAlexey Bataev int bazzz();
534e8231b5SAlexey Bataev int test();
544e8231b5SAlexey Bataev static int stat_unused_();
554e8231b5SAlexey Bataev static int stat_used_();
564e8231b5SAlexey Bataev 
574e8231b5SAlexey Bataev #pragma omp declare target
584e8231b5SAlexey Bataev 
594e8231b5SAlexey Bataev #pragma omp declare variant(foo) match(device = {kind(CORRECT)})
bar()60befb4be3SJohannes Doerfert int bar() { return 3; }
614e8231b5SAlexey Bataev 
624e8231b5SAlexey Bataev #pragma omp declare variant(bazzz) match(device = {kind(CORRECT)})
baz()63befb4be3SJohannes Doerfert int baz() { return 4; }
644e8231b5SAlexey Bataev 
654e8231b5SAlexey Bataev #pragma omp declare variant(test) match(device = {kind(CORRECT)})
call()66befb4be3SJohannes Doerfert int call() { return 5; }
674e8231b5SAlexey Bataev 
684e8231b5SAlexey Bataev #pragma omp declare variant(stat_unused_) match(device = {kind(CORRECT)})
stat_unused()69befb4be3SJohannes Doerfert static int stat_unused() { return 6; }
704e8231b5SAlexey Bataev 
714e8231b5SAlexey Bataev #pragma omp declare variant(stat_used_) match(device = {kind(CORRECT)})
stat_used()72befb4be3SJohannes Doerfert static int stat_used() { return 7; }
734e8231b5SAlexey Bataev 
744e8231b5SAlexey Bataev #pragma omp end declare target
754e8231b5SAlexey Bataev 
main()764e8231b5SAlexey Bataev int main() {
774e8231b5SAlexey Bataev   int res;
784e8231b5SAlexey Bataev #pragma omp target map(from \
794e8231b5SAlexey Bataev                        : res)
804e8231b5SAlexey Bataev   res = bar() + baz() + call();
814e8231b5SAlexey Bataev   return res;
824e8231b5SAlexey Bataev }
834e8231b5SAlexey Bataev 
test()84befb4be3SJohannes Doerfert int test() { return 8; }
stat_unused_()85befb4be3SJohannes Doerfert static int stat_unused_() { return 9; }
stat_used_()86befb4be3SJohannes Doerfert static int stat_used_() { return 10; }
874e8231b5SAlexey Bataev 
884e8231b5SAlexey Bataev #pragma omp declare target
894e8231b5SAlexey Bataev 
904e8231b5SAlexey Bataev struct SpecialFuncs {
vdSpecialFuncs914e8231b5SAlexey Bataev   void vd() {}
924e8231b5SAlexey Bataev   SpecialFuncs();
934e8231b5SAlexey Bataev   ~SpecialFuncs();
method_SpecialFuncs94befb4be3SJohannes Doerfert   int method_() { return 11; }
954e8231b5SAlexey Bataev #pragma omp declare variant(SpecialFuncs::method_) \
964e8231b5SAlexey Bataev     match(device = {kind(CORRECT)})
methodSpecialFuncs97befb4be3SJohannes Doerfert   int method() { return 12; }
984e8231b5SAlexey Bataev #pragma omp declare variant(SpecialFuncs::method_) \
994e8231b5SAlexey Bataev     match(device = {kind(CORRECT)})
1004e8231b5SAlexey Bataev   int Method();
1014e8231b5SAlexey Bataev } s;
1024e8231b5SAlexey Bataev 
Method()103befb4be3SJohannes Doerfert int SpecialFuncs::Method() { return 13; }
1044e8231b5SAlexey Bataev 
1054e8231b5SAlexey Bataev struct SpecSpecialFuncs {
vdSpecSpecialFuncs1064e8231b5SAlexey Bataev   void vd() {}
1074e8231b5SAlexey Bataev   SpecSpecialFuncs();
1084e8231b5SAlexey Bataev   ~SpecSpecialFuncs();
1094e8231b5SAlexey Bataev 
1104e8231b5SAlexey Bataev   int method_();
1114e8231b5SAlexey Bataev #pragma omp declare variant(SpecSpecialFuncs::method_) \
1124e8231b5SAlexey Bataev     match(device = {kind(CORRECT)})
methodSpecSpecialFuncs113befb4be3SJohannes Doerfert   int method() { return 14; }
1144e8231b5SAlexey Bataev #pragma omp declare variant(SpecSpecialFuncs::method_) \
1154e8231b5SAlexey Bataev     match(device = {kind(CORRECT)})
1164e8231b5SAlexey Bataev   int Method();
1174e8231b5SAlexey Bataev } s1;
1184e8231b5SAlexey Bataev 
1194e8231b5SAlexey Bataev #pragma omp end declare target
1204e8231b5SAlexey Bataev 
method_()121befb4be3SJohannes Doerfert int SpecSpecialFuncs::method_() { return 15; }
Method()122befb4be3SJohannes Doerfert int SpecSpecialFuncs::Method() { return 16; }
1234e8231b5SAlexey Bataev 
prio()124befb4be3SJohannes Doerfert int prio() { return 17; }
prio1()125befb4be3SJohannes Doerfert int prio1() { return 18; }
prio2()126befb4be3SJohannes Doerfert static int prio2() { return 19; }
prio3()127befb4be3SJohannes Doerfert static int prio3() { return 20; }
prio4()128befb4be3SJohannes Doerfert static int prio4() { return 21; }
fn_linkage_variant()129befb4be3SJohannes Doerfert int fn_linkage_variant() { return 22; }
fn_linkage_variant1()130befb4be3SJohannes Doerfert extern "C" int fn_linkage_variant1() { return 23; }
fn_variant2()131befb4be3SJohannes Doerfert int fn_variant2() { return 24; }
1324e8231b5SAlexey Bataev 
1334e8231b5SAlexey Bataev #pragma omp declare target
1344e8231b5SAlexey Bataev 
xxx()1354e8231b5SAlexey Bataev void xxx() {
1364e8231b5SAlexey Bataev   (void)s.method();
1374e8231b5SAlexey Bataev   (void)s1.method();
1384e8231b5SAlexey Bataev }
1394e8231b5SAlexey Bataev 
1404e8231b5SAlexey Bataev #pragma omp declare variant(prio) match(device = {kind(SUBSET)})
1414e8231b5SAlexey Bataev #pragma omp declare variant(prio1) match(device = {kind(CORRECT)})
prio_()142befb4be3SJohannes Doerfert int prio_() { return 25; }
1434e8231b5SAlexey Bataev 
1444e8231b5SAlexey Bataev #pragma omp declare variant(prio4) match(device = {kind(SUBSET)})
1454e8231b5SAlexey Bataev #pragma omp declare variant(prio2) match(device = {kind(CORRECT)})
1464e8231b5SAlexey Bataev #pragma omp declare variant(prio3) match(device = {kind(SUBSET)})
prio1_()147befb4be3SJohannes Doerfert static int prio1_() { return 26; }
1484e8231b5SAlexey Bataev 
int_fn()1494e8231b5SAlexey Bataev int int_fn() { return prio1_(); }
1504e8231b5SAlexey Bataev 
1514e8231b5SAlexey Bataev extern "C" {
1524e8231b5SAlexey Bataev #pragma omp declare variant(fn_linkage_variant) match(device = {kind(CORRECT)})
fn_linkage()153befb4be3SJohannes Doerfert int fn_linkage() { return 27; }
1544e8231b5SAlexey Bataev }
1554e8231b5SAlexey Bataev 
1564e8231b5SAlexey Bataev #pragma omp declare variant(fn_linkage_variant1) match(device = {kind(CORRECT)})
fn_linkage1()157befb4be3SJohannes Doerfert int fn_linkage1() { return 28; }
1584e8231b5SAlexey Bataev 
1594e8231b5SAlexey Bataev #pragma omp declare variant(fn_variant2) match(device = {kind(WRONG)})
fn2()160befb4be3SJohannes Doerfert int fn2() { return 29; }
1614e8231b5SAlexey Bataev 
1624e8231b5SAlexey Bataev #pragma omp end declare target
1634e8231b5SAlexey Bataev 
1644e8231b5SAlexey Bataev #endif // HEADER
165