170d2e542SAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp -x c++ -std=c++14 -fexceptions -fcxx-exceptions %s -ast-print -o - -Wno-source-uses-openmp -Wno-openmp-clauses | FileCheck %s
2bf5d4290SAlexey Bataev
370d2e542SAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp-simd -x c++ -std=c++14 -fexceptions -fcxx-exceptions %s -ast-print -o - -Wno-source-uses-openmp -Wno-openmp-clauses | FileCheck %s
4bf5d4290SAlexey Bataev
5bf5d4290SAlexey Bataev // expected-no-diagnostics
6bf5d4290SAlexey Bataev
7bf5d4290SAlexey Bataev // CHECK: int foo();
8bf5d4290SAlexey Bataev int foo();
9bf5d4290SAlexey Bataev
10bf5d4290SAlexey Bataev // CHECK: template <typename T> T foofoo() {
11bf5d4290SAlexey Bataev // CHECK-NEXT: return T();
12bf5d4290SAlexey Bataev // CHECK-NEXT: }
13bf5d4290SAlexey Bataev template <typename T>
foofoo()14bf5d4290SAlexey Bataev T foofoo() { return T(); }
15bf5d4290SAlexey Bataev
16bf5d4290SAlexey Bataev // CHECK: template<> int foofoo<int>() {
17bf5d4290SAlexey Bataev // CHECK-NEXT: return int();
18bf5d4290SAlexey Bataev // CHECK-NEXT: }
19bf5d4290SAlexey Bataev
20*976d474bScchen // CHECK: #pragma omp declare variant(foofoo<int>) match(construct={target})
21*976d474bScchen // CHECK-NEXT: #pragma omp declare variant(foofoo<int>) match(construct={simd})
22*976d474bScchen // CHECK-NEXT: #pragma omp declare variant(foofoo<int>) match(implementation={vendor(score(5): ibm)}, device={kind(fpga)})
231228d42dSJohannes Doerfert // CHECK-NEXT: #pragma omp declare variant(foofoo<int>) match(implementation={vendor(unknown)})
244e8231b5SAlexey Bataev // CHECK-NEXT: #pragma omp declare variant(foofoo<int>) match(implementation={vendor(score(0): llvm)}, device={kind(cpu)})
25bf5d4290SAlexey Bataev // CHECK-NEXT: int bar();
26bf5d4290SAlexey Bataev #pragma omp declare variant(foofoo <int>) match(xxx = {})
27bf5d4290SAlexey Bataev #pragma omp declare variant(foofoo <int>) match(xxx = {vvv})
281228d42dSJohannes Doerfert #pragma omp declare variant(foofoo <int>) match(implementation = {vendor(score(0): "llvm"), xxx}, device = {kind(cpu)})
291228d42dSJohannes Doerfert #pragma omp declare variant(foofoo <int>) match(implementation = {vendor("unknown")})
304e8231b5SAlexey Bataev #pragma omp declare variant(foofoo <int>) match(implementation = {vendor(score(5): ibm)}, device = {kind(fpga)})
31*976d474bScchen #pragma omp declare variant(foofoo <int>) match(construct = {simd})
32*976d474bScchen #pragma omp declare variant(foofoo <int>) match(construct = {target})
33bf5d4290SAlexey Bataev int bar();
34bf5d4290SAlexey Bataev
351228d42dSJohannes Doerfert // CHECK: #pragma omp declare variant(foofoo<T>) match(implementation={vendor(score(C + 5): ibm)}, device={kind(cpu, host)})
361228d42dSJohannes Doerfert // CHECK-NEXT: #pragma omp declare variant(foofoo<T>) match(implementation={vendor(unknown)})
371228d42dSJohannes Doerfert // CHECK-NEXT: #pragma omp declare variant(foofoo<T>) match(implementation={vendor(llvm)}, device={kind(cpu)})
381228d42dSJohannes Doerfert // CHECK-NEXT: #pragma omp declare variant(foofoo<T>) match(user={condition(false)})
391228d42dSJohannes Doerfert // CHECK-NEXT: #pragma omp declare variant(foofoo<T>) match(user={condition(true)})
40a15a1413SAlexey Bataev // CHECK-NEXT: template <typename T, int C> T barbar();
41bf5d4290SAlexey Bataev #pragma omp declare variant(foofoo <T>) match(xxx = {})
42bf5d4290SAlexey Bataev #pragma omp declare variant(foofoo <T>) match(xxx = {vvv})
431228d42dSJohannes Doerfert #pragma omp declare variant(foofoo <T>) match(user = {score(1 * 1 + 1) : condition(100 > 10 + 2)})
441228d42dSJohannes Doerfert #pragma omp declare variant(foofoo <T>) match(user = {score(0) : condition(0)})
451228d42dSJohannes Doerfert #pragma omp declare variant(foofoo <T>) match(user = {condition(true)})
461228d42dSJohannes Doerfert #pragma omp declare variant(foofoo <T>) match(user = {condition(false)})
474e8231b5SAlexey Bataev #pragma omp declare variant(foofoo <T>) match(implementation = {vendor(llvm)}, device = {kind(cpu)})
489ff34745SAlexey Bataev #pragma omp declare variant(foofoo <T>) match(implementation={vendor(unknown)})
494e8231b5SAlexey Bataev #pragma omp declare variant(foofoo <T>) match(implementation={vendor(score(C+5): ibm, xxx, ibm)},device={kind(cpu,host)})
50a15a1413SAlexey Bataev template <typename T, int C>
51bf5d4290SAlexey Bataev T barbar();
52bf5d4290SAlexey Bataev
531228d42dSJohannes Doerfert // CHECK: #pragma omp declare variant(foofoo<int>) match(implementation={vendor(score(3 + 5): ibm)}, device={kind(cpu, host)})
541228d42dSJohannes Doerfert // CHECK-NEXT: #pragma omp declare variant(foofoo<int>) match(implementation={vendor(unknown)})
551228d42dSJohannes Doerfert // CHECK-NEXT: #pragma omp declare variant(foofoo<int>) match(implementation={vendor(llvm)}, device={kind(cpu)})
561228d42dSJohannes Doerfert // CHECK-NEXT: #pragma omp declare variant(foofoo<int>) match(user={condition(false)})
571228d42dSJohannes Doerfert // CHECK-NEXT: #pragma omp declare variant(foofoo<int>) match(user={condition(true)})
58a15a1413SAlexey Bataev // CHECK-NEXT: template<> int barbar<int, 3>();
59bf5d4290SAlexey Bataev
60bf5d4290SAlexey Bataev // CHECK-NEXT: int baz() {
61a15a1413SAlexey Bataev // CHECK-NEXT: return barbar<int, 3>();
62bf5d4290SAlexey Bataev // CHECK-NEXT: }
baz()63bf5d4290SAlexey Bataev int baz() {
64a15a1413SAlexey Bataev return barbar<int, 3>();
65bf5d4290SAlexey Bataev }
66bf5d4290SAlexey Bataev
67bf5d4290SAlexey Bataev // CHECK: template <class C> void h_ref(C *hp, C *hp2, C *hq, C *lin) {
68bf5d4290SAlexey Bataev // CHECK-NEXT: }
69bf5d4290SAlexey Bataev // CHECK-NEXT: template<> void h_ref<double>(double *hp, double *hp2, double *hq, double *lin) {
70bf5d4290SAlexey Bataev // CHECK-NEXT: }
71befb4be3SJohannes Doerfert // CHECK-NEXT: template<> void h_ref<float>(float *hp, float *hp2, float *hq, float *lin)
72bf5d4290SAlexey Bataev template <class C>
h_ref(C * hp,C * hp2,C * hq,C * lin)73bf5d4290SAlexey Bataev void h_ref(C *hp, C *hp2, C *hq, C *lin) {
74bf5d4290SAlexey Bataev }
75bf5d4290SAlexey Bataev
761228d42dSJohannes Doerfert // CHECK: #pragma omp declare variant(h_ref<C>) match(implementation={vendor(unknown)}, device={kind(nohost)})
771228d42dSJohannes Doerfert // CHECK-NEXT: #pragma omp declare variant(h_ref<C>) match(implementation={vendor(llvm)}, device={kind(gpu)})
78bf5d4290SAlexey Bataev // CHECK-NEXT: template <class C> void h(C *hp, C *hp2, C *hq, C *lin) {
79bf5d4290SAlexey Bataev // CHECK-NEXT: }
80bf5d4290SAlexey Bataev #pragma omp declare variant(h_ref <C>) match(xxx = {})
814e8231b5SAlexey Bataev #pragma omp declare variant(h_ref <C>) match(implementation = {vendor(llvm)}, device = {kind(gpu)})
824e8231b5SAlexey Bataev #pragma omp declare variant(h_ref <C>) match(implementation = {vendor(unknown)}, device = {kind(nohost)})
83bf5d4290SAlexey Bataev template <class C>
h(C * hp,C * hp2,C * hq,C * lin)84bf5d4290SAlexey Bataev void h(C *hp, C *hp2, C *hq, C *lin) {
85bf5d4290SAlexey Bataev }
86bf5d4290SAlexey Bataev
871228d42dSJohannes Doerfert // CHECK: #pragma omp declare variant(h_ref<float>) match(implementation={vendor(unknown)}, device={kind(nohost)})
881228d42dSJohannes Doerfert // CHECK-NEXT: #pragma omp declare variant(h_ref<float>) match(implementation={vendor(llvm)}, device={kind(gpu)})
89bf5d4290SAlexey Bataev // CHECK-NEXT: template<> void h<float>(float *hp, float *hp2, float *hq, float *lin) {
90bf5d4290SAlexey Bataev // CHECK-NEXT: }
91bf5d4290SAlexey Bataev
92bf5d4290SAlexey Bataev // CHECK-NEXT: template<> void h<double>(double *hp, double *hp2, double *hq, double *lin) {
93bf5d4290SAlexey Bataev // CHECK-NEXT: h((float *)hp, (float *)hp2, (float *)hq, (float *)lin);
94bf5d4290SAlexey Bataev // CHECK-NEXT: }
95bf5d4290SAlexey Bataev #pragma omp declare variant(h_ref <double>) match(xxx = {})
964e8231b5SAlexey Bataev #pragma omp declare variant(h_ref <double>) match(implementation = {vendor(ibm)}, device = {kind(cpu, gpu)})
979ff34745SAlexey Bataev #pragma omp declare variant(h_ref <double>) match(implementation={vendor(unknown)})
98bf5d4290SAlexey Bataev template <>
h(double * hp,double * hp2,double * hq,double * lin)99bf5d4290SAlexey Bataev void h(double *hp, double *hp2, double *hq, double *lin) {
100bf5d4290SAlexey Bataev h((float *)hp, (float *)hp2, (float *)hq, (float *)lin);
101bf5d4290SAlexey Bataev }
102bf5d4290SAlexey Bataev
103bf5d4290SAlexey Bataev // CHECK: int fn();
104bf5d4290SAlexey Bataev int fn();
105bf5d4290SAlexey Bataev // CHECK: int fn(int);
106bf5d4290SAlexey Bataev int fn(int);
1071228d42dSJohannes Doerfert // CHECK: #pragma omp declare variant(fn) match(implementation={vendor(unknown)}, device={kind(cpu, gpu)})
1081228d42dSJohannes Doerfert // CHECK-NEXT: #pragma omp declare variant(fn) match(implementation={vendor(llvm)})
109bf5d4290SAlexey Bataev // CHECK-NEXT: int overload();
110bf5d4290SAlexey Bataev #pragma omp declare variant(fn) match(xxx = {})
1115d154c3eSAlexey Bataev #pragma omp declare variant(fn) match(implementation={vendor(llvm)})
1124e8231b5SAlexey Bataev #pragma omp declare variant(fn) match(implementation = {vendor(unknown)}, device = {kind(cpu, gpu)})
113bf5d4290SAlexey Bataev int overload(void);
114bf5d4290SAlexey Bataev
115bf5d4290SAlexey Bataev // CHECK: int fn_deduced_variant() {
116bf5d4290SAlexey Bataev // CHECK-NEXT: return 0;
117bf5d4290SAlexey Bataev // CHECK-NEXT: }
fn_deduced_variant()118bf5d4290SAlexey Bataev auto fn_deduced_variant() { return 0; }
1191228d42dSJohannes Doerfert // CHECK: #pragma omp declare variant(fn_deduced_variant) match(implementation={vendor(unknown)}, device={kind(gpu, nohost)})
1201228d42dSJohannes Doerfert // CHECK-NEXT: #pragma omp declare variant(fn_deduced_variant) match(implementation={vendor(llvm)}, device={kind(cpu, host)})
121bf5d4290SAlexey Bataev // CHECK-NEXT: int fn_deduced();
122bf5d4290SAlexey Bataev #pragma omp declare variant(fn_deduced_variant) match(xxx = {})
1234e8231b5SAlexey Bataev #pragma omp declare variant(fn_deduced_variant) match(implementation = {vendor(llvm)}, device = {kind(cpu, host)})
1244e8231b5SAlexey Bataev #pragma omp declare variant(fn_deduced_variant) match(implementation = {vendor(unknown)}, device = {kind(gpu, nohost)})
125bf5d4290SAlexey Bataev int fn_deduced();
126bf5d4290SAlexey Bataev
127bf5d4290SAlexey Bataev // CHECK: int fn_deduced_variant1();
128bf5d4290SAlexey Bataev int fn_deduced_variant1();
1291228d42dSJohannes Doerfert // CHECK: #pragma omp declare variant(fn_deduced_variant1) match(implementation={vendor(unknown)}, device={kind(cpu, host)})
1301228d42dSJohannes Doerfert // CHECK-NEXT: #pragma omp declare variant(fn_deduced_variant1) match(implementation={vendor(ibm)}, device={kind(gpu, nohost)})
131bf5d4290SAlexey Bataev // CHECK-NEXT: int fn_deduced1() {
132bf5d4290SAlexey Bataev // CHECK-NEXT: return 0;
133bf5d4290SAlexey Bataev // CHECK-NEXT: }
134bf5d4290SAlexey Bataev #pragma omp declare variant(fn_deduced_variant1) match(xxx = {})
1354e8231b5SAlexey Bataev #pragma omp declare variant(fn_deduced_variant1) match(implementation = {vendor(ibm)}, device = {kind(gpu, nohost)})
1364e8231b5SAlexey Bataev #pragma omp declare variant(fn_deduced_variant1) match(implementation = {vendor(unknown)}, device = {kind(cpu, host)})
fn_deduced1()137bf5d4290SAlexey Bataev auto fn_deduced1() { return 0; }
138bf5d4290SAlexey Bataev
139bf5d4290SAlexey Bataev // CHECK: struct SpecialFuncs {
140bf5d4290SAlexey Bataev // CHECK-NEXT: void vd() {
141bf5d4290SAlexey Bataev // CHECK-NEXT: }
142bf5d4290SAlexey Bataev // CHECK-NEXT: SpecialFuncs();
143bf5d4290SAlexey Bataev // CHECK-NEXT: ~SpecialFuncs() noexcept;
144bf5d4290SAlexey Bataev // CHECK-NEXT: void baz() {
145bf5d4290SAlexey Bataev // CHECK-NEXT: }
146bf5d4290SAlexey Bataev // CHECK-NEXT: void bar() {
147bf5d4290SAlexey Bataev // CHECK-NEXT: }
148bf5d4290SAlexey Bataev // CHECK-NEXT: void bar(int) {
149bf5d4290SAlexey Bataev // CHECK-NEXT: }
1501228d42dSJohannes Doerfert // CHECK-NEXT: #pragma omp declare variant(SpecialFuncs::baz) match(implementation={vendor(unknown)}, device={kind(nohost)})
1511228d42dSJohannes Doerfert // CHECK-NEXT: #pragma omp declare variant(SpecialFuncs::bar) match(implementation={vendor(ibm)}, device={kind(cpu)})
152bf5d4290SAlexey Bataev // CHECK-NEXT: void foo1() {
153bf5d4290SAlexey Bataev // CHECK-NEXT: }
1541228d42dSJohannes Doerfert // CHECK-NEXT: #pragma omp declare variant(SpecialFuncs::baz) match(implementation={vendor(unknown)}, device={kind(cpu, host)})
1556db44193SAlexey Bataev // CHECK-NEXT: void xxx();
156bf5d4290SAlexey Bataev // CHECK-NEXT: } s;
157bf5d4290SAlexey Bataev struct SpecialFuncs {
vdSpecialFuncs158bf5d4290SAlexey Bataev void vd() {}
159bf5d4290SAlexey Bataev SpecialFuncs();
160bf5d4290SAlexey Bataev ~SpecialFuncs();
161bf5d4290SAlexey Bataev
bazSpecialFuncs162bf5d4290SAlexey Bataev void baz() {}
barSpecialFuncs163bf5d4290SAlexey Bataev void bar() {}
barSpecialFuncs164bf5d4290SAlexey Bataev void bar(int) {}
165bf5d4290SAlexey Bataev #pragma omp declare variant(SpecialFuncs::baz) match(xxx = {})
166bf5d4290SAlexey Bataev #pragma omp declare variant(SpecialFuncs::bar) match(xxx = {})
1674e8231b5SAlexey Bataev #pragma omp declare variant(SpecialFuncs::bar) match(implementation = {vendor(ibm)}, device = {kind(cpu)})
1684e8231b5SAlexey Bataev #pragma omp declare variant(SpecialFuncs::baz) match(implementation = {vendor(unknown)}, device = {kind(nohost)})
foo1SpecialFuncs169bf5d4290SAlexey Bataev void foo1() {}
1704e8231b5SAlexey Bataev #pragma omp declare variant(SpecialFuncs::baz) match(implementation = {vendor(unknown)}, device = {kind(cpu, host)})
1716db44193SAlexey Bataev void xxx();
172bf5d4290SAlexey Bataev } s;
173bf5d4290SAlexey Bataev
1741228d42dSJohannes Doerfert // CHECK: #pragma omp declare variant(SpecialFuncs::baz) match(implementation={vendor(unknown)}, device={kind(cpu, host)})
1756db44193SAlexey Bataev // CHECK-NEXT: void SpecialFuncs::xxx() {
1766db44193SAlexey Bataev // CHECK-NEXT: }
xxx()1776db44193SAlexey Bataev void SpecialFuncs::xxx() {}
1786db44193SAlexey Bataev
179bf5d4290SAlexey Bataev // CHECK: static void static_f_variant() {
180bf5d4290SAlexey Bataev // CHECK-NEXT: }
static_f_variant()181bf5d4290SAlexey Bataev static void static_f_variant() {}
1821228d42dSJohannes Doerfert // CHECK: #pragma omp declare variant(static_f_variant) match(implementation={vendor(unknown)})
1831228d42dSJohannes Doerfert // CHECK-NEXT: #pragma omp declare variant(static_f_variant) match(implementation={vendor(llvm)}, device={kind(fpga)})
184bf5d4290SAlexey Bataev // CHECK-NEXT: static void static_f() {
185bf5d4290SAlexey Bataev // CHECK-NEXT: }
186bf5d4290SAlexey Bataev #pragma omp declare variant(static_f_variant) match(xxx = {})
1874e8231b5SAlexey Bataev #pragma omp declare variant(static_f_variant) match(implementation = {vendor(llvm)}, device = {kind(fpga)})
1889ff34745SAlexey Bataev #pragma omp declare variant(static_f_variant) match(implementation={vendor(unknown)})
static_f()189bf5d4290SAlexey Bataev static void static_f() {}
190bf5d4290SAlexey Bataev
191bf5d4290SAlexey Bataev // CHECK: void bazzzz() {
192bf5d4290SAlexey Bataev // CHECK-NEXT: s.foo1();
193bf5d4290SAlexey Bataev // CHECK-NEXT: static_f();
194bf5d4290SAlexey Bataev // CHECK-NEXT: }
bazzzz()195bf5d4290SAlexey Bataev void bazzzz() {
196bf5d4290SAlexey Bataev s.foo1();
197bf5d4290SAlexey Bataev static_f();
198bf5d4290SAlexey Bataev }
1996b06ead1SAlexey Bataev
2006b06ead1SAlexey Bataev // CHECK: int fn_linkage_variant();
2016b06ead1SAlexey Bataev // CHECK: extern "C" {
2021228d42dSJohannes Doerfert // CHECK: #pragma omp declare variant(fn_linkage_variant) match(implementation={vendor(ti)}, device={kind(cpu, host)})
2036b06ead1SAlexey Bataev // CHECK: int fn_linkage();
2046b06ead1SAlexey Bataev // CHECK: }
2056b06ead1SAlexey Bataev int fn_linkage_variant();
2066b06ead1SAlexey Bataev extern "C" {
2071228d42dSJohannes Doerfert #pragma omp declare variant(fn_linkage_variant) match(implementation = {vendor(ti)}, device = {kind(cpu, host)})
2086b06ead1SAlexey Bataev int fn_linkage();
2096b06ead1SAlexey Bataev }
2106b06ead1SAlexey Bataev
2116b06ead1SAlexey Bataev // CHECK: extern "C" int fn_linkage_variant1()
2121228d42dSJohannes Doerfert // CHECK: #pragma omp declare variant(fn_linkage_variant1) match(implementation={vendor(gnu)}, device={kind(cpu, host)})
2136b06ead1SAlexey Bataev // CHECK: int fn_linkage1();
2146b06ead1SAlexey Bataev extern "C" int fn_linkage_variant1();
2151228d42dSJohannes Doerfert #pragma omp declare variant(fn_linkage_variant1) match(implementation = {vendor(gnu)}, device = {kind(cpu, host)})
2166b06ead1SAlexey Bataev int fn_linkage1();
2176b06ead1SAlexey Bataev
218