// RUN: %clang_cc1 -verify -fopenmp -x c++ -std=c++14 -fexceptions -fcxx-exceptions %s -ast-print -o - | FileCheck %s // RUN: %clang_cc1 -verify -fopenmp-simd -x c++ -std=c++14 -fexceptions -fcxx-exceptions %s -ast-print -o - | FileCheck %s // expected-no-diagnostics // CHECK: int foo(); int foo(); // CHECK: template T foofoo() { // CHECK-NEXT: return T(); // CHECK-NEXT: } template T foofoo() { return T(); } // CHECK: template<> int foofoo() { // CHECK-NEXT: return int(); // CHECK-NEXT: } // CHECK: #pragma omp declare variant(foofoo) match(unknown={}) // CHECK-NEXT: #pragma omp declare variant(foofoo) match(unknown={}) // CHECK-NEXT: int bar(); #pragma omp declare variant(foofoo ) match(xxx = {}) #pragma omp declare variant(foofoo ) match(xxx = {vvv}) int bar(); // CHECK: #pragma omp declare variant(foofoo) match(unknown={}) // CHECK-NEXT: #pragma omp declare variant(foofoo) match(unknown={}) // CHECK-NEXT: #pragma omp declare variant(foofoo) match(unknown={}) // CHECK-NEXT: #pragma omp declare variant(foofoo) match(unknown={}) // CHECK-NEXT: #pragma omp declare variant(foofoo) match(unknown={}) // CHECK-NEXT: #pragma omp declare variant(foofoo) match(unknown={}) // CHECK-NEXT: #pragma omp declare variant(foofoo) match(unknown={}) // CHECK-NEXT: template T barbar(); #pragma omp declare variant(foofoo ) match(xxx = {}) #pragma omp declare variant(foofoo ) match(xxx = {vvv}) #pragma omp declare variant(foofoo ) match(user = {score() : condition()}) #pragma omp declare variant(foofoo ) match(user = {score() : condition()}, user = {condition()}) #pragma omp declare variant(foofoo ) match(user = {condition()}) #pragma omp declare variant(foofoo ) match(user = {condition()}) template T barbar(); // CHECK: #pragma omp declare variant(foofoo) match(unknown={}) // CHECK-NEXT: #pragma omp declare variant(foofoo) match(unknown={}) // CHECK-NEXT: #pragma omp declare variant(foofoo) match(unknown={}) // CHECK-NEXT: #pragma omp declare variant(foofoo) match(unknown={}) // CHECK-NEXT: #pragma omp declare variant(foofoo) match(unknown={}) // CHECK-NEXT: #pragma omp declare variant(foofoo) match(unknown={}) // CHECK-NEXT: #pragma omp declare variant(foofoo) match(unknown={}) // CHECK-NEXT: template<> int barbar(); // CHECK-NEXT: int baz() { // CHECK-NEXT: return barbar(); // CHECK-NEXT: } int baz() { return barbar(); } // CHECK: template void h_ref(C *hp, C *hp2, C *hq, C *lin) { // CHECK-NEXT: } // CHECK-NEXT: template<> void h_ref(double *hp, double *hp2, double *hq, double *lin) { // CHECK-NEXT: } // CHECK-NEXT: template<> void h_ref(float *hp, float *hp2, float *hq, float *lin) { // CHECK-NEXT: } template void h_ref(C *hp, C *hp2, C *hq, C *lin) { } // CHECK: #pragma omp declare variant(h_ref) match(unknown={}) // CHECK-NEXT: template void h(C *hp, C *hp2, C *hq, C *lin) { // CHECK-NEXT: } #pragma omp declare variant(h_ref ) match(xxx = {}) template void h(C *hp, C *hp2, C *hq, C *lin) { } // CHECK: #pragma omp declare variant(h_ref) match(unknown={}) // CHECK-NEXT: template<> void h(float *hp, float *hp2, float *hq, float *lin) { // CHECK-NEXT: } // CHECK-NEXT: template<> void h(double *hp, double *hp2, double *hq, double *lin) { // CHECK-NEXT: h((float *)hp, (float *)hp2, (float *)hq, (float *)lin); // CHECK-NEXT: } #pragma omp declare variant(h_ref ) match(xxx = {}) template <> void h(double *hp, double *hp2, double *hq, double *lin) { h((float *)hp, (float *)hp2, (float *)hq, (float *)lin); } // CHECK: int fn(); int fn(); // CHECK: int fn(int); int fn(int); // CHECK: #pragma omp declare variant(fn) match(unknown={}) // CHECK-NEXT: int overload(); #pragma omp declare variant(fn) match(xxx = {}) int overload(void); // CHECK: int fn_deduced_variant() { // CHECK-NEXT: return 0; // CHECK-NEXT: } auto fn_deduced_variant() { return 0; } // CHECK: #pragma omp declare variant(fn_deduced_variant) match(unknown={}) // CHECK-NEXT: int fn_deduced(); #pragma omp declare variant(fn_deduced_variant) match(xxx = {}) int fn_deduced(); // CHECK: int fn_deduced_variant1(); int fn_deduced_variant1(); // CHECK: #pragma omp declare variant(fn_deduced_variant1) match(unknown={}) // CHECK-NEXT: int fn_deduced1() { // CHECK-NEXT: return 0; // CHECK-NEXT: } #pragma omp declare variant(fn_deduced_variant1) match(xxx = {}) auto fn_deduced1() { return 0; } // CHECK: struct SpecialFuncs { // CHECK-NEXT: void vd() { // CHECK-NEXT: } // CHECK-NEXT: SpecialFuncs(); // CHECK-NEXT: ~SpecialFuncs() noexcept; // CHECK-NEXT: void baz() { // CHECK-NEXT: } // CHECK-NEXT: void bar() { // CHECK-NEXT: } // CHECK-NEXT: void bar(int) { // CHECK-NEXT: } // CHECK-NEXT: #pragma omp declare variant(SpecialFuncs::bar) match(unknown={}) // CHECK-NEXT: #pragma omp declare variant(SpecialFuncs::baz) match(unknown={}) // CHECK-NEXT: void foo1() { // CHECK-NEXT: } // CHECK-NEXT: } s; struct SpecialFuncs { void vd() {} SpecialFuncs(); ~SpecialFuncs(); void baz() {} void bar() {} void bar(int) {} #pragma omp declare variant(SpecialFuncs::baz) match(xxx = {}) #pragma omp declare variant(SpecialFuncs::bar) match(xxx = {}) void foo1() {} } s; // CHECK: static void static_f_variant() { // CHECK-NEXT: } static void static_f_variant() {} // CHECK: #pragma omp declare variant(static_f_variant) match(unknown={}) // CHECK-NEXT: static void static_f() { // CHECK-NEXT: } #pragma omp declare variant(static_f_variant) match(xxx = {}) static void static_f() {} // CHECK: void bazzzz() { // CHECK-NEXT: s.foo1(); // CHECK-NEXT: static_f(); // CHECK-NEXT: } void bazzzz() { s.foo1(); static_f(); }