blob: d0c3373302f78a9dddca5244793a8f9d40ede1f5 [file] [log] [blame]
Saiyedul Islamff260ad2020-08-27 19:35:36 +00001// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -x c++ -triple x86_64-unknown-linux -emit-llvm %s -fexceptions -fcxx-exceptions -o - -fsanitize-address-use-after-scope | FileCheck %s --implicit-check-not='ret i32 {{6|7|8|10|13|15|19|22|23|24}}'
2// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple x86_64-unknown-linux -fexceptions -fcxx-exceptions -emit-pch -o %t -fopenmp-version=45 %s
3// 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=45 | FileCheck %s --implicit-check-not='ret i32 {{6|7|8|10|13|15|19|22|23|24}}'
4
Johannes Doerfertbefb4be2020-02-25 14:04:06 -08005// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple x86_64-unknown-linux -emit-llvm %s -fexceptions -fcxx-exceptions -o - -fsanitize-address-use-after-scope | FileCheck %s --implicit-check-not='ret i32 {{6|7|8|10|13|15|19|22|23|24}}'
Saiyedul Islamff260ad2020-08-27 19:35:36 +00006// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple x86_64-unknown-linux -fexceptions -fcxx-exceptions -emit-pch -o %t %s
7// 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 - | FileCheck %s --implicit-check-not='ret i32 {{6|7|8|10|13|15|19|22|23|24}}'
Johannes Doerfertbefb4be2020-02-25 14:04:06 -08008
Alexey Bataev4e8231b2019-11-05 15:13:30 -05009// expected-no-diagnostics
10
Johannes Doerfertbefb4be2020-02-25 14:04:06 -080011// CHECK-DAG: ret i32 2
12// CHECK-DAG: ret i32 3
13// CHECK-DAG: ret i32 4
14// CHECK-DAG: ret i32 5
15// CHECK-DAG: ret i32 9
16// CHECK-DAG: ret i32 11
17// CHECK-DAG: ret i32 12
18// CHECK-DAG: ret i32 14
19// CHECK-DAG: ret i32 16
20// CHECK-DAG: ret i32 17
21// CHECK-DAG: ret i32 18
22// CHECK-DAG: ret i32 19
23// CHECK-DAG: ret i32 20
24// CHECK-DAG: ret i32 21
25// CHECK-DAG: ret i32 25
26// CHECK-DAG: ret i32 26
27// CHECK-DAG: ret i32 27
28// CHECK-DAG: ret i32 28
29// CHECK-DAG: ret i32 29
30// CHECK-DAG: ret i32 30
31// CHECK-DAG: ret i32 31
Alexey Bataev4e8231b2019-11-05 15:13:30 -050032
33#ifndef HEADER
34#define HEADER
35
36int foo() { return 2; }
37
38#pragma omp declare variant(foo) match(implementation = {vendor(llvm)}, device={kind(cpu)})
Johannes Doerfertbefb4be2020-02-25 14:04:06 -080039int bar() { return 3; }
Alexey Bataev4e8231b2019-11-05 15:13:30 -050040
41int bazzz();
42#pragma omp declare variant(bazzz) match(implementation = {vendor(llvm)}, device={kind(host)})
Johannes Doerfertbefb4be2020-02-25 14:04:06 -080043int baz() { return 4; }
Alexey Bataev4e8231b2019-11-05 15:13:30 -050044
45int test();
46#pragma omp declare variant(test) match(implementation = {vendor(llvm)}, device={kind(cpu)})
Johannes Doerfertbefb4be2020-02-25 14:04:06 -080047int call() { return 5; }
Alexey Bataev4e8231b2019-11-05 15:13:30 -050048
Johannes Doerfertbefb4be2020-02-25 14:04:06 -080049static int stat_unused_no_emit() { return 6; }
Alexey Bataev4e8231b2019-11-05 15:13:30 -050050static int stat_unused_();
51#pragma omp declare variant(stat_unused_) match(implementation = {vendor(llvm)}, device={kind(cpu)})
Johannes Doerfert1228d422019-12-19 20:42:12 -060052#pragma omp declare variant(stat_unused_no_emit) match(implementation = {vendor(unknown)}, device = {kind(gpu)})
Johannes Doerfertbefb4be2020-02-25 14:04:06 -080053static int stat_unused() { return 7; }
Alexey Bataev4e8231b2019-11-05 15:13:30 -050054
55static int stat_used_();
56#pragma omp declare variant(stat_used_) match(implementation = {vendor(llvm)}, device={kind(host)})
Johannes Doerfertbefb4be2020-02-25 14:04:06 -080057static int stat_used() { return 8; }
Alexey Bataev4e8231b2019-11-05 15:13:30 -050058
59int main() { return bar() + baz() + call() + stat_used(); }
60
Johannes Doerfertbefb4be2020-02-25 14:04:06 -080061int test() { return 9; }
62static int stat_unused_() { return 10; }
63static int stat_used_() { return 11; }
Alexey Bataev4e8231b2019-11-05 15:13:30 -050064
65struct SpecialFuncs {
66 void vd() {}
67 SpecialFuncs();
68 ~SpecialFuncs();
69
Johannes Doerfertbefb4be2020-02-25 14:04:06 -080070 int method_() { return 12; }
Alexey Bataev4e8231b2019-11-05 15:13:30 -050071#pragma omp declare variant(SpecialFuncs::method_) \
72 match(implementation = {vendor(llvm)}, device={kind(cpu)})
Johannes Doerfertbefb4be2020-02-25 14:04:06 -080073 int method() { return 13; }
Alexey Bataev4e8231b2019-11-05 15:13:30 -050074#pragma omp declare variant(SpecialFuncs::method_) \
75 match(implementation = {vendor(llvm)}, device={kind(host)})
76 int Method();
77} s;
78
Johannes Doerfertbefb4be2020-02-25 14:04:06 -080079int SpecialFuncs::Method() { return 14; }
Alexey Bataev4e8231b2019-11-05 15:13:30 -050080
81struct SpecSpecialFuncs {
82 void vd() {}
83 SpecSpecialFuncs();
84 ~SpecSpecialFuncs();
85
86 int method_();
87#pragma omp declare variant(SpecSpecialFuncs::method_) \
88 match(implementation = {vendor(llvm)}, device={kind(cpu)})
Johannes Doerfertbefb4be2020-02-25 14:04:06 -080089 int method() { return 15; }
Alexey Bataev4e8231b2019-11-05 15:13:30 -050090#pragma omp declare variant(SpecSpecialFuncs::method_) \
91 match(implementation = {vendor(llvm)}, device={kind(host)})
92 int Method();
93} s1;
94
Johannes Doerfertbefb4be2020-02-25 14:04:06 -080095int SpecSpecialFuncs::method_() { return 16; }
96int SpecSpecialFuncs::Method() { return 17; }
Alexey Bataev4e8231b2019-11-05 15:13:30 -050097
98void xxx() {
99 (void)s.method();
100 (void)s1.method();
101}
102
Johannes Doerfertbefb4be2020-02-25 14:04:06 -0800103int prio() { return 18; }
104int prio1() { return 19; }
Alexey Bataev4e8231b2019-11-05 15:13:30 -0500105
Johannes Doerfert1228d422019-12-19 20:42:12 -0600106#pragma omp declare variant(prio1) match(implementation = {vendor(score(2): llvm)}, device={kind(cpu,host)})
107#pragma omp declare variant(prio) match(implementation = {vendor(score(1): llvm)}, device={kind(cpu)})
Johannes Doerfertbefb4be2020-02-25 14:04:06 -0800108int prio_() { return 20; }
Alexey Bataev4e8231b2019-11-05 15:13:30 -0500109
Johannes Doerfertbefb4be2020-02-25 14:04:06 -0800110static int prio2() { return 21; }
111static int prio3() { return 22; }
112static int prio4() { return 23; }
Alexey Bataev4e8231b2019-11-05 15:13:30 -0500113
Johannes Doerfert1228d422019-12-19 20:42:12 -0600114#pragma omp declare variant(prio4) match(implementation = {vendor(score(5): llvm)})
115#pragma omp declare variant(prio2) match(implementation = {vendor(score(8): llvm)}, device={kind(cpu,host)})
Alexey Bataev4e8231b2019-11-05 15:13:30 -0500116#pragma omp declare variant(prio3) match(implementation = {vendor(score(7): llvm)}, device={kind(cpu)})
Johannes Doerfertbefb4be2020-02-25 14:04:06 -0800117static int prio1_() { return 24; }
Alexey Bataev4e8231b2019-11-05 15:13:30 -0500118
119int int_fn() { return prio1_(); }
120
Johannes Doerfertbefb4be2020-02-25 14:04:06 -0800121int fn_linkage_variant() { return 25; }
Alexey Bataev4e8231b2019-11-05 15:13:30 -0500122extern "C" {
123#pragma omp declare variant(fn_linkage_variant) match(implementation = {vendor(llvm)}, device={kind(cpu)})
Johannes Doerfertbefb4be2020-02-25 14:04:06 -0800124int fn_linkage() { return 26; }
Alexey Bataev4e8231b2019-11-05 15:13:30 -0500125}
126
Johannes Doerfertbefb4be2020-02-25 14:04:06 -0800127extern "C" int fn_linkage_variant1() { return 27; }
Alexey Bataev4e8231b2019-11-05 15:13:30 -0500128#pragma omp declare variant(fn_linkage_variant1) match(implementation = {vendor(llvm)}, device={kind(host)})
Johannes Doerfertbefb4be2020-02-25 14:04:06 -0800129int fn_linkage1() { return 28; }
Alexey Bataev4e8231b2019-11-05 15:13:30 -0500130
Johannes Doerfertbefb4be2020-02-25 14:04:06 -0800131int fn_variant2() { return 29; }
Alexey Bataev4e8231b2019-11-05 15:13:30 -0500132#pragma omp declare variant(fn_variant2) match(implementation = {vendor(llvm, ibm)}, device={kind(cpu)})
133#pragma omp declare variant(fn_variant2) match(implementation = {vendor(llvm)}, device={kind(cpu,gpu)})
134#pragma omp declare variant(fn_variant2) match(implementation = {vendor(llvm)}, device={kind(nohost)})
135#pragma omp declare variant(fn_variant2) match(implementation = {vendor(llvm)}, device={kind(cpu,nohost)})
136#pragma omp declare variant(fn_variant2) match(implementation = {vendor(llvm)}, device={kind(gpu)})
137#pragma omp declare variant(fn_variant2) match(implementation = {vendor(llvm)}, device={kind(fpga)})
Johannes Doerfertbefb4be2020-02-25 14:04:06 -0800138int fn2() { return 30; }
Alexey Bataev4e8231b2019-11-05 15:13:30 -0500139
Johannes Doerfert1228d422019-12-19 20:42:12 -0600140#pragma omp declare variant(stat_unused_no_emit) match(implementation = {vendor(unknown)}, device = {kind(gpu)})
Alexey Bataev02d04d52019-12-10 16:12:53 -0500141template <typename T>
Johannes Doerfertbefb4be2020-02-25 14:04:06 -0800142static T stat_unused_T() { return 31; }
Alexey Bataev02d04d52019-12-10 16:12:53 -0500143
144int bazzzzzzzz() {
145 return stat_unused_T<int>();
146}
147
Alexey Bataev4e8231b2019-11-05 15:13:30 -0500148#endif // HEADER