1*4e8231b5SAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple x86_64-unknown-linux -emit-llvm %s -fexceptions -fcxx-exceptions -o - -fsanitize-address-use-after-scope -DHOST | FileCheck %s
2*4e8231b5SAlexey Bataev // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple x86_64-unknown-linux -fexceptions -fcxx-exceptions -emit-pch -o %t -fopenmp-version=50 %s -DHOST
3*4e8231b5SAlexey Bataev // RUN: %clang_cc1 -fopenmp -x c++ -triple x86_64-unknown-linux -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - -fopenmp-version=50 -DHOST | FileCheck %s
4*4e8231b5SAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple aarch64-unknown-linux -emit-llvm %s -fexceptions -fcxx-exceptions -o - -fsanitize-address-use-after-scope -DHOST | FileCheck %s
5*4e8231b5SAlexey Bataev // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple aarch64-unknown-linux -fexceptions -fcxx-exceptions -emit-pch -o %t -fopenmp-version=50 %s -DHOST
6*4e8231b5SAlexey Bataev // RUN: %clang_cc1 -fopenmp -x c++ -triple aarch64-unknown-linux -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - -fopenmp-version=50 -DHOST | FileCheck %s
7*4e8231b5SAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple ppc64le-unknown-linux -emit-llvm %s -fexceptions -fcxx-exceptions -o - -fsanitize-address-use-after-scope -DHOST | FileCheck %s
8*4e8231b5SAlexey Bataev // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple ppc64le-unknown-linux -fexceptions -fcxx-exceptions -emit-pch -o %t -fopenmp-version=50 %s -DHOST
9*4e8231b5SAlexey Bataev // RUN: %clang_cc1 -fopenmp -x c++ -triple ppc64le-unknown-linux -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - -fopenmp-version=50 -DHOST | FileCheck %s
10*4e8231b5SAlexey Bataev 
11*4e8231b5SAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple x86_64-unknown-linux -emit-llvm %s -fexceptions -fcxx-exceptions -o - -fsanitize-address-use-after-scope -DCPU | FileCheck %s
12*4e8231b5SAlexey Bataev // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple x86_64-unknown-linux -fexceptions -fcxx-exceptions -emit-pch -o %t -fopenmp-version=50 %s -DCPU
13*4e8231b5SAlexey Bataev // RUN: %clang_cc1 -fopenmp -x c++ -triple x86_64-unknown-linux -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - -fopenmp-version=50 -DCPU | FileCheck %s
14*4e8231b5SAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple aarch64-unknown-linux -emit-llvm %s -fexceptions -fcxx-exceptions -o - -fsanitize-address-use-after-scope -DCPU | FileCheck %s
15*4e8231b5SAlexey Bataev // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple aarch64-unknown-linux -fexceptions -fcxx-exceptions -emit-pch -o %t -fopenmp-version=50 %s -DCPU
16*4e8231b5SAlexey Bataev // RUN: %clang_cc1 -fopenmp -x c++ -triple aarch64-unknown-linux -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - -fopenmp-version=50 -DCPU | FileCheck %s
17*4e8231b5SAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple ppc64le-unknown-linux -emit-llvm %s -fexceptions -fcxx-exceptions -o - -fsanitize-address-use-after-scope -DCPU | FileCheck %s
18*4e8231b5SAlexey Bataev // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple ppc64le-unknown-linux -fexceptions -fcxx-exceptions -emit-pch -o %t -fopenmp-version=50 %s -DCPU
19*4e8231b5SAlexey Bataev // RUN: %clang_cc1 -fopenmp -x c++ -triple ppc64le-unknown-linux -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - -fopenmp-version=50 -DCPU | FileCheck %s
20*4e8231b5SAlexey Bataev 
21*4e8231b5SAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple x86_64-unknown-linux -fopenmp-targets=x86_64-unknown-linux -emit-llvm-bc %s -o %t-host.bc -DCPU
22*4e8231b5SAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple x86_64-unknown-linux -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-host.bc -o - -DCPU | FileCheck %s
23*4e8231b5SAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple x86_64-unknown-linux -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-host.bc -emit-pch -o %t -DCPU
24*4e8231b5SAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple x86_64-unknown-linux -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-host.bc -include-pch %t -o - -DCPU | FileCheck %s
25*4e8231b5SAlexey Bataev 
26*4e8231b5SAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple ppc64le-unknown-linux -fopenmp-targets=ppc64le-unknown-linux -emit-llvm-bc %s -o %t-host.bc -DCPU
27*4e8231b5SAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple ppc64le-unknown-linux -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-host.bc -o - -DCPU | FileCheck %s
28*4e8231b5SAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple ppc64le-unknown-linux -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-host.bc -emit-pch -o %t -DCPU
29*4e8231b5SAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple ppc64le-unknown-linux -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-host.bc -include-pch %t -o - -DCPU | FileCheck %s
30*4e8231b5SAlexey Bataev 
31*4e8231b5SAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple x86_64-unknown-linux -fopenmp-targets=x86_64-unknown-linux -emit-llvm-bc %s -o %t-host.bc -DNOHOST
32*4e8231b5SAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple x86_64-unknown-linux -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-host.bc -o - -DNOHOST | FileCheck %s
33*4e8231b5SAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple x86_64-unknown-linux -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-host.bc -emit-pch -o %t -DNOHOST
34*4e8231b5SAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple x86_64-unknown-linux -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-host.bc -include-pch %t -o - -DNOHOST | FileCheck %s
35*4e8231b5SAlexey Bataev 
36*4e8231b5SAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple ppc64le-unknown-linux -fopenmp-targets=ppc64le-unknown-linux -emit-llvm-bc %s -o %t-host.bc -DNOHOST
37*4e8231b5SAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple ppc64le-unknown-linux -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-host.bc -o - -DNOHOST | FileCheck %s
38*4e8231b5SAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple ppc64le-unknown-linux -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-host.bc -emit-pch -o %t -DNOHOST
39*4e8231b5SAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple ppc64le-unknown-linux -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-host.bc -include-pch %t -o - -DNOHOST | FileCheck %s
40*4e8231b5SAlexey Bataev 
41*4e8231b5SAlexey Bataev // expected-no-diagnostics
42*4e8231b5SAlexey Bataev 
43*4e8231b5SAlexey Bataev // CHECK-NOT: ret i32 {{1|4|81|84}}
44*4e8231b5SAlexey Bataev // CHECK-DAG: @_Z3barv = {{.*}}alias i32 (), i32 ()* @_Z3foov
45*4e8231b5SAlexey Bataev // CHECK-DAG: @_ZN16SpecSpecialFuncs6MethodEv = {{.*}}alias i32 (%struct.SpecSpecialFuncs*), i32 (%struct.SpecSpecialFuncs*)* @_ZN16SpecSpecialFuncs7method_Ev
46*4e8231b5SAlexey Bataev // CHECK-DAG: @_ZN16SpecSpecialFuncs6methodEv = linkonce_odr {{.*}}alias i32 (%struct.SpecSpecialFuncs*), i32 (%struct.SpecSpecialFuncs*)* @_ZN16SpecSpecialFuncs7method_Ev
47*4e8231b5SAlexey Bataev // CHECK-DAG: @_ZN12SpecialFuncs6methodEv = linkonce_odr {{.*}}alias i32 (%struct.SpecialFuncs*), i32 (%struct.SpecialFuncs*)* @_ZN12SpecialFuncs7method_Ev
48*4e8231b5SAlexey Bataev // CHECK-DAG: @_Z5prio_v = {{.*}}alias i32 (), i32 ()* @_Z5prio1v
49*4e8231b5SAlexey Bataev // CHECK-DAG: @_ZL6prio1_v = internal alias i32 (), i32 ()* @_ZL5prio2v
50*4e8231b5SAlexey Bataev // CHECK-DAG: @_Z4callv = {{.*}}alias i32 (), i32 ()* @_Z4testv
51*4e8231b5SAlexey Bataev // CHECK-DAG: @_ZL9stat_usedv = internal alias i32 (), i32 ()* @_ZL10stat_used_v
52*4e8231b5SAlexey Bataev // CHECK-DAG: @_ZN12SpecialFuncs6MethodEv = {{.*}}alias i32 (%struct.SpecialFuncs*), i32 (%struct.SpecialFuncs*)* @_ZN12SpecialFuncs7method_Ev
53*4e8231b5SAlexey Bataev // CHECK-DAG: @fn_linkage = {{.*}}alias i32 (), i32 ()* @_Z18fn_linkage_variantv
54*4e8231b5SAlexey Bataev // CHECK-DAG: @_Z11fn_linkage1v = {{.*}}alias i32 (), i32 ()* @fn_linkage_variant1
55*4e8231b5SAlexey Bataev // CHECK-DAG: declare {{.*}}i32 @_Z5bazzzv()
56*4e8231b5SAlexey Bataev // CHECK-DAG: declare {{.*}}i32 @_Z3bazv()
57*4e8231b5SAlexey Bataev // CHECK-DAG: ret i32 2
58*4e8231b5SAlexey Bataev // CHECK-DAG: ret i32 3
59*4e8231b5SAlexey Bataev // CHECK-DAG: ret i32 5
60*4e8231b5SAlexey Bataev // CHECK-DAG: ret i32 6
61*4e8231b5SAlexey Bataev // CHECK-DAG: ret i32 7
62*4e8231b5SAlexey Bataev // CHECK-DAG: ret i32 82
63*4e8231b5SAlexey Bataev // CHECK-DAG: ret i32 83
64*4e8231b5SAlexey Bataev // CHECK-DAG: ret i32 85
65*4e8231b5SAlexey Bataev // CHECK-DAG: ret i32 86
66*4e8231b5SAlexey Bataev // CHECK-DAG: ret i32 87
67*4e8231b5SAlexey Bataev // CHECK-NOT: ret i32 {{1|4|81|84}}
68*4e8231b5SAlexey Bataev 
69*4e8231b5SAlexey Bataev #ifndef HEADER
70*4e8231b5SAlexey Bataev #define HEADER
71*4e8231b5SAlexey Bataev 
72*4e8231b5SAlexey Bataev #pragma omp declare target
73*4e8231b5SAlexey Bataev #ifdef HOST
74*4e8231b5SAlexey Bataev #define CORRECT host
75*4e8231b5SAlexey Bataev #define SUBSET host, cpu
76*4e8231b5SAlexey Bataev #define WRONG host, nohost
77*4e8231b5SAlexey Bataev #endif // HOST
78*4e8231b5SAlexey Bataev #ifdef CPU
79*4e8231b5SAlexey Bataev #define CORRECT cpu
80*4e8231b5SAlexey Bataev #define SUBSET host, cpu
81*4e8231b5SAlexey Bataev #define WRONG cpu, gpu
82*4e8231b5SAlexey Bataev #endif // CPU
83*4e8231b5SAlexey Bataev #ifdef NOHOST
84*4e8231b5SAlexey Bataev #define CORRECT nohost
85*4e8231b5SAlexey Bataev #define SUBSET nohost, cpu
86*4e8231b5SAlexey Bataev #define WRONG nohost, host
87*4e8231b5SAlexey Bataev #endif // NOHOST
88*4e8231b5SAlexey Bataev 
89*4e8231b5SAlexey Bataev int foo() { return 2; }
90*4e8231b5SAlexey Bataev 
91*4e8231b5SAlexey Bataev #pragma omp declare variant(foo) match(device = {kind(CORRECT)})
92*4e8231b5SAlexey Bataev int bar() { return 1; }
93*4e8231b5SAlexey Bataev 
94*4e8231b5SAlexey Bataev int bazzz();
95*4e8231b5SAlexey Bataev #pragma omp declare variant(bazzz) match(device = {kind(CORRECT)})
96*4e8231b5SAlexey Bataev int baz() { return 1; }
97*4e8231b5SAlexey Bataev 
98*4e8231b5SAlexey Bataev int test();
99*4e8231b5SAlexey Bataev #pragma omp declare variant(test) match(device = {kind(CORRECT)})
100*4e8231b5SAlexey Bataev int call() { return 1; }
101*4e8231b5SAlexey Bataev 
102*4e8231b5SAlexey Bataev static int stat_unused_();
103*4e8231b5SAlexey Bataev #pragma omp declare variant(stat_unused_) match(device = {kind(CORRECT)})
104*4e8231b5SAlexey Bataev static int stat_unused() { return 1; }
105*4e8231b5SAlexey Bataev 
106*4e8231b5SAlexey Bataev static int stat_used_();
107*4e8231b5SAlexey Bataev #pragma omp declare variant(stat_used_) match(device = {kind(CORRECT)})
108*4e8231b5SAlexey Bataev static int stat_used() { return 1; }
109*4e8231b5SAlexey Bataev 
110*4e8231b5SAlexey Bataev int main() { return bar() + baz() + call() + stat_used(); }
111*4e8231b5SAlexey Bataev 
112*4e8231b5SAlexey Bataev int test() { return 3; }
113*4e8231b5SAlexey Bataev static int stat_unused_() { return 4; }
114*4e8231b5SAlexey Bataev static int stat_used_() { return 5; }
115*4e8231b5SAlexey Bataev 
116*4e8231b5SAlexey Bataev struct SpecialFuncs {
117*4e8231b5SAlexey Bataev   void vd() {}
118*4e8231b5SAlexey Bataev   SpecialFuncs();
119*4e8231b5SAlexey Bataev   ~SpecialFuncs();
120*4e8231b5SAlexey Bataev 
121*4e8231b5SAlexey Bataev   int method_() { return 6; }
122*4e8231b5SAlexey Bataev #pragma omp declare variant(SpecialFuncs::method_) \
123*4e8231b5SAlexey Bataev     match(device = {kind(CORRECT)})
124*4e8231b5SAlexey Bataev   int method() { return 1; }
125*4e8231b5SAlexey Bataev #pragma omp declare variant(SpecialFuncs::method_) \
126*4e8231b5SAlexey Bataev     match(device = {kind(CORRECT)})
127*4e8231b5SAlexey Bataev   int Method();
128*4e8231b5SAlexey Bataev } s;
129*4e8231b5SAlexey Bataev 
130*4e8231b5SAlexey Bataev int SpecialFuncs::Method() { return 1; }
131*4e8231b5SAlexey Bataev 
132*4e8231b5SAlexey Bataev struct SpecSpecialFuncs {
133*4e8231b5SAlexey Bataev   void vd() {}
134*4e8231b5SAlexey Bataev   SpecSpecialFuncs();
135*4e8231b5SAlexey Bataev   ~SpecSpecialFuncs();
136*4e8231b5SAlexey Bataev 
137*4e8231b5SAlexey Bataev   int method_();
138*4e8231b5SAlexey Bataev #pragma omp declare variant(SpecSpecialFuncs::method_) \
139*4e8231b5SAlexey Bataev     match(device = {kind(CORRECT)})
140*4e8231b5SAlexey Bataev   int method() { return 1; }
141*4e8231b5SAlexey Bataev #pragma omp declare variant(SpecSpecialFuncs::method_) \
142*4e8231b5SAlexey Bataev     match(device = {kind(CORRECT)})
143*4e8231b5SAlexey Bataev   int Method();
144*4e8231b5SAlexey Bataev } s1;
145*4e8231b5SAlexey Bataev 
146*4e8231b5SAlexey Bataev int SpecSpecialFuncs::method_() { return 7; }
147*4e8231b5SAlexey Bataev int SpecSpecialFuncs::Method() { return 1; }
148*4e8231b5SAlexey Bataev 
149*4e8231b5SAlexey Bataev void xxx() {
150*4e8231b5SAlexey Bataev   (void)s.method();
151*4e8231b5SAlexey Bataev   (void)s1.method();
152*4e8231b5SAlexey Bataev }
153*4e8231b5SAlexey Bataev 
154*4e8231b5SAlexey Bataev int prio() { return 81; }
155*4e8231b5SAlexey Bataev int prio1() { return 82; }
156*4e8231b5SAlexey Bataev 
157*4e8231b5SAlexey Bataev #pragma omp declare variant(prio) match(device = {kind(SUBSET)})
158*4e8231b5SAlexey Bataev #pragma omp declare variant(prio1) match(device = {kind(CORRECT)})
159*4e8231b5SAlexey Bataev int prio_() { return 1; }
160*4e8231b5SAlexey Bataev 
161*4e8231b5SAlexey Bataev static int prio2() { return 83; }
162*4e8231b5SAlexey Bataev static int prio3() { return 84; }
163*4e8231b5SAlexey Bataev static int prio4() { return 84; }
164*4e8231b5SAlexey Bataev 
165*4e8231b5SAlexey Bataev #pragma omp declare variant(prio4) match(device = {kind(SUBSET)})
166*4e8231b5SAlexey Bataev #pragma omp declare variant(prio2) match(device = {kind(CORRECT)})
167*4e8231b5SAlexey Bataev #pragma omp declare variant(prio3) match(device = {kind(SUBSET)})
168*4e8231b5SAlexey Bataev static int prio1_() { return 1; }
169*4e8231b5SAlexey Bataev 
170*4e8231b5SAlexey Bataev int int_fn() { return prio1_(); }
171*4e8231b5SAlexey Bataev 
172*4e8231b5SAlexey Bataev int fn_linkage_variant() { return 85; }
173*4e8231b5SAlexey Bataev extern "C" {
174*4e8231b5SAlexey Bataev #pragma omp declare variant(fn_linkage_variant) match(device = {kind(CORRECT)})
175*4e8231b5SAlexey Bataev int fn_linkage() { return 1; }
176*4e8231b5SAlexey Bataev }
177*4e8231b5SAlexey Bataev 
178*4e8231b5SAlexey Bataev extern "C" int fn_linkage_variant1() { return 86; }
179*4e8231b5SAlexey Bataev #pragma omp declare variant(fn_linkage_variant1) match(device = {kind(CORRECT)})
180*4e8231b5SAlexey Bataev int fn_linkage1() { return 1; }
181*4e8231b5SAlexey Bataev 
182*4e8231b5SAlexey Bataev int fn_variant2() { return 1; }
183*4e8231b5SAlexey Bataev #pragma omp declare variant(fn_variant2) match(device = {kind(WRONG)})
184*4e8231b5SAlexey Bataev int fn2() { return 87; }
185*4e8231b5SAlexey Bataev 
186*4e8231b5SAlexey Bataev #pragma omp end declare target
187*4e8231b5SAlexey Bataev #endif // HEADER
188