blob: a8c18f68228560a8c9e8fedf2a4c4111ee703074 [file] [log] [blame]
Alexey Bataev12026142019-09-26 20:04:15 +00001// RUN: %clang_cc1 -verify -fopenmp -x c++ -std=c++14 -fexceptions -fcxx-exceptions %s -ast-print -o - -Wno-source-uses-openmp | FileCheck %s
Alexey Bataevbf5d4292019-09-17 17:36:49 +00002
Alexey Bataev12026142019-09-26 20:04:15 +00003// RUN: %clang_cc1 -verify -fopenmp-simd -x c++ -std=c++14 -fexceptions -fcxx-exceptions %s -ast-print -o - -Wno-source-uses-openmp | FileCheck %s
Alexey Bataevbf5d4292019-09-17 17:36:49 +00004
5// expected-no-diagnostics
6
7// CHECK: int foo();
8int foo();
9
10// CHECK: template <typename T> T foofoo() {
11// CHECK-NEXT: return T();
12// CHECK-NEXT: }
13template <typename T>
14T foofoo() { return T(); }
15
16// CHECK: template<> int foofoo<int>() {
17// CHECK-NEXT: return int();
18// CHECK-NEXT: }
19
Alexey Bataev9ff34742019-09-25 19:43:37 +000020// CHECK: #pragma omp declare variant(foofoo<int>) match(implementation={vendor(unknown)})
21// CHECK-NEXT: #pragma omp declare variant(foofoo<int>) match(implementation={vendor(ibm)})
22// CHECK-NEXT: #pragma omp declare variant(foofoo<int>) match(implementation={vendor(llvm)})
Alexey Bataevbf5d4292019-09-17 17:36:49 +000023// CHECK-NEXT: int bar();
24#pragma omp declare variant(foofoo <int>) match(xxx = {})
25#pragma omp declare variant(foofoo <int>) match(xxx = {vvv})
Alexey Bataev9ff34742019-09-25 19:43:37 +000026#pragma omp declare variant(foofoo <int>) match(implementation={vendor(ibm)}, implementation={vendor(llvm)})
27#pragma omp declare variant(foofoo <int>) match(implementation={vendor(unknown)})
Alexey Bataevbf5d4292019-09-17 17:36:49 +000028int bar();
29
Alexey Bataev9ff34742019-09-25 19:43:37 +000030// CHECK: #pragma omp declare variant(foofoo<T>) match(implementation={vendor(unknown)})
31// CHECK-NEXT: #pragma omp declare variant(foofoo<T>) match(implementation={vendor(ibm)})
32// CHECK-NEXT: #pragma omp declare variant(foofoo<T>) match(implementation={vendor(llvm)})
Alexey Bataevbf5d4292019-09-17 17:36:49 +000033// CHECK-NEXT: template <typename T> T barbar();
34#pragma omp declare variant(foofoo <T>) match(xxx = {})
35#pragma omp declare variant(foofoo <T>) match(xxx = {vvv})
36#pragma omp declare variant(foofoo <T>) match(user = {score(<expr>) : condition(<expr>)})
Alexey Bataev0736f7f2019-09-18 16:24:31 +000037#pragma omp declare variant(foofoo <T>) match(user = {score(<expr>) : condition(<expr>)}, user = {condition(<expr>)})
Alexey Bataevbf5d4292019-09-17 17:36:49 +000038#pragma omp declare variant(foofoo <T>) match(user = {condition(<expr>)})
39#pragma omp declare variant(foofoo <T>) match(user = {condition(<expr>)})
Alexey Bataev9ff34742019-09-25 19:43:37 +000040#pragma omp declare variant(foofoo <T>) match(implementation={vendor(ibm)}, implementation={vendor(llvm)})
41#pragma omp declare variant(foofoo <T>) match(implementation={vendor(unknown)})
Alexey Bataevbf5d4292019-09-17 17:36:49 +000042template <typename T>
43T barbar();
44
Alexey Bataev9ff34742019-09-25 19:43:37 +000045// CHECK: #pragma omp declare variant(foofoo<int>) match(implementation={vendor(unknown)})
46// CHECK-NEXT: #pragma omp declare variant(foofoo<int>) match(implementation={vendor(ibm)})
47// CHECK-NEXT: #pragma omp declare variant(foofoo<int>) match(implementation={vendor(llvm)})
Alexey Bataevbf5d4292019-09-17 17:36:49 +000048// CHECK-NEXT: template<> int barbar<int>();
49
50// CHECK-NEXT: int baz() {
51// CHECK-NEXT: return barbar<int>();
52// CHECK-NEXT: }
53int baz() {
54 return barbar<int>();
55}
56
57// CHECK: template <class C> void h_ref(C *hp, C *hp2, C *hq, C *lin) {
58// CHECK-NEXT: }
59// CHECK-NEXT: template<> void h_ref<double>(double *hp, double *hp2, double *hq, double *lin) {
60// CHECK-NEXT: }
61// CHECK-NEXT: template<> void h_ref<float>(float *hp, float *hp2, float *hq, float *lin) {
62// CHECK-NEXT: }
63template <class C>
64void h_ref(C *hp, C *hp2, C *hq, C *lin) {
65}
66
Alexey Bataev9ff34742019-09-25 19:43:37 +000067// CHECK: #pragma omp declare variant(h_ref<C>) match(implementation={vendor(unknown)})
68// CHECK-NEXT: #pragma omp declare variant(h_ref<C>) match(implementation={vendor(ibm)})
69// CHECK-NEXT: #pragma omp declare variant(h_ref<C>) match(implementation={vendor(llvm)})
Alexey Bataevbf5d4292019-09-17 17:36:49 +000070// CHECK-NEXT: template <class C> void h(C *hp, C *hp2, C *hq, C *lin) {
71// CHECK-NEXT: }
72#pragma omp declare variant(h_ref <C>) match(xxx = {})
Alexey Bataev9ff34742019-09-25 19:43:37 +000073#pragma omp declare variant(h_ref <C>) match(implementation={vendor(ibm)}, implementation={vendor(llvm)})
74#pragma omp declare variant(h_ref <C>) match(implementation={vendor(unknown)})
Alexey Bataevbf5d4292019-09-17 17:36:49 +000075template <class C>
76void h(C *hp, C *hp2, C *hq, C *lin) {
77}
78
Alexey Bataev9ff34742019-09-25 19:43:37 +000079// CHECK: #pragma omp declare variant(h_ref<float>) match(implementation={vendor(unknown)})
80// CHECK-NEXT: #pragma omp declare variant(h_ref<float>) match(implementation={vendor(ibm)})
81// CHECK-NEXT: #pragma omp declare variant(h_ref<float>) match(implementation={vendor(llvm)})
Alexey Bataevbf5d4292019-09-17 17:36:49 +000082// CHECK-NEXT: template<> void h<float>(float *hp, float *hp2, float *hq, float *lin) {
83// CHECK-NEXT: }
84
85// CHECK-NEXT: template<> void h<double>(double *hp, double *hp2, double *hq, double *lin) {
86// CHECK-NEXT: h((float *)hp, (float *)hp2, (float *)hq, (float *)lin);
87// CHECK-NEXT: }
88#pragma omp declare variant(h_ref <double>) match(xxx = {})
Alexey Bataev9ff34742019-09-25 19:43:37 +000089#pragma omp declare variant(h_ref <double>) match(implementation={vendor(ibm)}, implementation={vendor(llvm)})
90#pragma omp declare variant(h_ref <double>) match(implementation={vendor(unknown)})
Alexey Bataevbf5d4292019-09-17 17:36:49 +000091template <>
92void h(double *hp, double *hp2, double *hq, double *lin) {
93 h((float *)hp, (float *)hp2, (float *)hq, (float *)lin);
94}
95
96// CHECK: int fn();
97int fn();
98// CHECK: int fn(int);
99int fn(int);
Alexey Bataev9ff34742019-09-25 19:43:37 +0000100// CHECK: #pragma omp declare variant(fn) match(implementation={vendor(unknown)})
101// CHECK-NEXT: #pragma omp declare variant(fn) match(implementation={vendor(ibm)})
102// CHECK-NEXT: #pragma omp declare variant(fn) match(implementation={vendor(llvm)})
Alexey Bataevbf5d4292019-09-17 17:36:49 +0000103// CHECK-NEXT: int overload();
104#pragma omp declare variant(fn) match(xxx = {})
Alexey Bataev9ff34742019-09-25 19:43:37 +0000105#pragma omp declare variant(fn) match(implementation={vendor(ibm)}, implementation={vendor(llvm)})
106#pragma omp declare variant(fn) match(implementation={vendor(unknown)})
Alexey Bataevbf5d4292019-09-17 17:36:49 +0000107int overload(void);
108
109// CHECK: int fn_deduced_variant() {
110// CHECK-NEXT: return 0;
111// CHECK-NEXT: }
112auto fn_deduced_variant() { return 0; }
Alexey Bataev9ff34742019-09-25 19:43:37 +0000113// CHECK: #pragma omp declare variant(fn_deduced_variant) match(implementation={vendor(unknown)})
114// CHECK-NEXT: #pragma omp declare variant(fn_deduced_variant) match(implementation={vendor(ibm)})
115// CHECK-NEXT: #pragma omp declare variant(fn_deduced_variant) match(implementation={vendor(llvm)})
Alexey Bataevbf5d4292019-09-17 17:36:49 +0000116// CHECK-NEXT: int fn_deduced();
117#pragma omp declare variant(fn_deduced_variant) match(xxx = {})
Alexey Bataev9ff34742019-09-25 19:43:37 +0000118#pragma omp declare variant(fn_deduced_variant) match(implementation={vendor(ibm)}, implementation={vendor(llvm)})
119#pragma omp declare variant(fn_deduced_variant) match(implementation={vendor(unknown)})
Alexey Bataevbf5d4292019-09-17 17:36:49 +0000120int fn_deduced();
121
122// CHECK: int fn_deduced_variant1();
123int fn_deduced_variant1();
Alexey Bataev9ff34742019-09-25 19:43:37 +0000124// CHECK: #pragma omp declare variant(fn_deduced_variant1) match(implementation={vendor(unknown)})
125// CHECK-NEXT: #pragma omp declare variant(fn_deduced_variant1) match(implementation={vendor(ibm)})
126// CHECK-NEXT: #pragma omp declare variant(fn_deduced_variant1) match(implementation={vendor(llvm)})
Alexey Bataevbf5d4292019-09-17 17:36:49 +0000127// CHECK-NEXT: int fn_deduced1() {
128// CHECK-NEXT: return 0;
129// CHECK-NEXT: }
130#pragma omp declare variant(fn_deduced_variant1) match(xxx = {})
Alexey Bataev9ff34742019-09-25 19:43:37 +0000131#pragma omp declare variant(fn_deduced_variant1) match(implementation={vendor(ibm)}, implementation={vendor(llvm)})
132#pragma omp declare variant(fn_deduced_variant1) match(implementation={vendor(unknown)})
Alexey Bataevbf5d4292019-09-17 17:36:49 +0000133auto fn_deduced1() { return 0; }
134
135// CHECK: struct SpecialFuncs {
136// CHECK-NEXT: void vd() {
137// CHECK-NEXT: }
138// CHECK-NEXT: SpecialFuncs();
139// CHECK-NEXT: ~SpecialFuncs() noexcept;
140// CHECK-NEXT: void baz() {
141// CHECK-NEXT: }
142// CHECK-NEXT: void bar() {
143// CHECK-NEXT: }
144// CHECK-NEXT: void bar(int) {
145// CHECK-NEXT: }
Alexey Bataev9ff34742019-09-25 19:43:37 +0000146// CHECK-NEXT: #pragma omp declare variant(SpecialFuncs::baz) match(implementation={vendor(unknown)})
147// CHECK-NEXT: #pragma omp declare variant(SpecialFuncs::bar) match(implementation={vendor(ibm)})
148// CHECK-NEXT: #pragma omp declare variant(SpecialFuncs::bar) match(implementation={vendor(llvm)})
Alexey Bataevbf5d4292019-09-17 17:36:49 +0000149// CHECK-NEXT: void foo1() {
150// CHECK-NEXT: }
151// CHECK-NEXT: } s;
152struct SpecialFuncs {
153 void vd() {}
154 SpecialFuncs();
155 ~SpecialFuncs();
156
157 void baz() {}
158 void bar() {}
159 void bar(int) {}
160#pragma omp declare variant(SpecialFuncs::baz) match(xxx = {})
161#pragma omp declare variant(SpecialFuncs::bar) match(xxx = {})
Alexey Bataev9ff34742019-09-25 19:43:37 +0000162#pragma omp declare variant(SpecialFuncs::bar) match(implementation={vendor(ibm)}, implementation={vendor(llvm)})
163#pragma omp declare variant(SpecialFuncs::baz) match(implementation={vendor(unknown)})
Alexey Bataevbf5d4292019-09-17 17:36:49 +0000164 void foo1() {}
165} s;
166
167// CHECK: static void static_f_variant() {
168// CHECK-NEXT: }
169static void static_f_variant() {}
Alexey Bataev9ff34742019-09-25 19:43:37 +0000170// CHECK: #pragma omp declare variant(static_f_variant) match(implementation={vendor(unknown)})
171// CHECK-NEXT: #pragma omp declare variant(static_f_variant) match(implementation={vendor(ibm)})
172// CHECK-NEXT: #pragma omp declare variant(static_f_variant) match(implementation={vendor(llvm)})
Alexey Bataevbf5d4292019-09-17 17:36:49 +0000173// CHECK-NEXT: static void static_f() {
174// CHECK-NEXT: }
175#pragma omp declare variant(static_f_variant) match(xxx = {})
Alexey Bataev9ff34742019-09-25 19:43:37 +0000176#pragma omp declare variant(static_f_variant) match(implementation={vendor(ibm)}, implementation={vendor(llvm)})
177#pragma omp declare variant(static_f_variant) match(implementation={vendor(unknown)})
Alexey Bataevbf5d4292019-09-17 17:36:49 +0000178static void static_f() {}
179
180// CHECK: void bazzzz() {
181// CHECK-NEXT: s.foo1();
182// CHECK-NEXT: static_f();
183// CHECK-NEXT: }
184void bazzzz() {
185 s.foo1();
186 static_f();
187}