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