1 // 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}}' 2 // 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 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=50 | FileCheck %s --implicit-check-not='ret i32 {{6|7|8|10|13|15|19|22|23|24}}' 4 5 // expected-no-diagnostics 6 7 // CHECK-DAG: ret i32 2 8 // CHECK-DAG: ret i32 3 9 // CHECK-DAG: ret i32 4 10 // CHECK-DAG: ret i32 5 11 // CHECK-DAG: ret i32 9 12 // CHECK-DAG: ret i32 11 13 // CHECK-DAG: ret i32 12 14 // CHECK-DAG: ret i32 14 15 // CHECK-DAG: ret i32 16 16 // CHECK-DAG: ret i32 17 17 // CHECK-DAG: ret i32 18 18 // CHECK-DAG: ret i32 19 19 // CHECK-DAG: ret i32 20 20 // CHECK-DAG: ret i32 21 21 // CHECK-DAG: ret i32 25 22 // CHECK-DAG: ret i32 26 23 // CHECK-DAG: ret i32 27 24 // CHECK-DAG: ret i32 28 25 // CHECK-DAG: ret i32 29 26 // CHECK-DAG: ret i32 30 27 // CHECK-DAG: ret i32 31 28 29 #ifndef HEADER 30 #define HEADER 31 32 int foo() { return 2; } 33 34 #pragma omp declare variant(foo) match(implementation = {vendor(llvm)}, device={kind(cpu)}) 35 int bar() { return 3; } 36 37 int bazzz(); 38 #pragma omp declare variant(bazzz) match(implementation = {vendor(llvm)}, device={kind(host)}) 39 int baz() { return 4; } 40 41 int test(); 42 #pragma omp declare variant(test) match(implementation = {vendor(llvm)}, device={kind(cpu)}) 43 int call() { return 5; } 44 45 static int stat_unused_no_emit() { return 6; } 46 static int stat_unused_(); 47 #pragma omp declare variant(stat_unused_) match(implementation = {vendor(llvm)}, device={kind(cpu)}) 48 #pragma omp declare variant(stat_unused_no_emit) match(implementation = {vendor(unknown)}, device = {kind(gpu)}) 49 static int stat_unused() { return 7; } 50 51 static int stat_used_(); 52 #pragma omp declare variant(stat_used_) match(implementation = {vendor(llvm)}, device={kind(host)}) 53 static int stat_used() { return 8; } 54 55 int main() { return bar() + baz() + call() + stat_used(); } 56 57 int test() { return 9; } 58 static int stat_unused_() { return 10; } 59 static int stat_used_() { return 11; } 60 61 struct SpecialFuncs { 62 void vd() {} 63 SpecialFuncs(); 64 ~SpecialFuncs(); 65 66 int method_() { return 12; } 67 #pragma omp declare variant(SpecialFuncs::method_) \ 68 match(implementation = {vendor(llvm)}, device={kind(cpu)}) 69 int method() { return 13; } 70 #pragma omp declare variant(SpecialFuncs::method_) \ 71 match(implementation = {vendor(llvm)}, device={kind(host)}) 72 int Method(); 73 } s; 74 75 int SpecialFuncs::Method() { return 14; } 76 77 struct SpecSpecialFuncs { 78 void vd() {} 79 SpecSpecialFuncs(); 80 ~SpecSpecialFuncs(); 81 82 int method_(); 83 #pragma omp declare variant(SpecSpecialFuncs::method_) \ 84 match(implementation = {vendor(llvm)}, device={kind(cpu)}) 85 int method() { return 15; } 86 #pragma omp declare variant(SpecSpecialFuncs::method_) \ 87 match(implementation = {vendor(llvm)}, device={kind(host)}) 88 int Method(); 89 } s1; 90 91 int SpecSpecialFuncs::method_() { return 16; } 92 int SpecSpecialFuncs::Method() { return 17; } 93 94 void xxx() { 95 (void)s.method(); 96 (void)s1.method(); 97 } 98 99 int prio() { return 18; } 100 int prio1() { return 19; } 101 102 #pragma omp declare variant(prio1) match(implementation = {vendor(score(2): llvm)}, device={kind(cpu,host)}) 103 #pragma omp declare variant(prio) match(implementation = {vendor(score(1): llvm)}, device={kind(cpu)}) 104 int prio_() { return 20; } 105 106 static int prio2() { return 21; } 107 static int prio3() { return 22; } 108 static int prio4() { return 23; } 109 110 #pragma omp declare variant(prio4) match(implementation = {vendor(score(5): llvm)}) 111 #pragma omp declare variant(prio2) match(implementation = {vendor(score(8): llvm)}, device={kind(cpu,host)}) 112 #pragma omp declare variant(prio3) match(implementation = {vendor(score(7): llvm)}, device={kind(cpu)}) 113 static int prio1_() { return 24; } 114 115 int int_fn() { return prio1_(); } 116 117 int fn_linkage_variant() { return 25; } 118 extern "C" { 119 #pragma omp declare variant(fn_linkage_variant) match(implementation = {vendor(llvm)}, device={kind(cpu)}) 120 int fn_linkage() { return 26; } 121 } 122 123 extern "C" int fn_linkage_variant1() { return 27; } 124 #pragma omp declare variant(fn_linkage_variant1) match(implementation = {vendor(llvm)}, device={kind(host)}) 125 int fn_linkage1() { return 28; } 126 127 int fn_variant2() { return 29; } 128 #pragma omp declare variant(fn_variant2) match(implementation = {vendor(llvm, ibm)}, device={kind(cpu)}) 129 #pragma omp declare variant(fn_variant2) match(implementation = {vendor(llvm)}, device={kind(cpu,gpu)}) 130 #pragma omp declare variant(fn_variant2) match(implementation = {vendor(llvm)}, device={kind(nohost)}) 131 #pragma omp declare variant(fn_variant2) match(implementation = {vendor(llvm)}, device={kind(cpu,nohost)}) 132 #pragma omp declare variant(fn_variant2) match(implementation = {vendor(llvm)}, device={kind(gpu)}) 133 #pragma omp declare variant(fn_variant2) match(implementation = {vendor(llvm)}, device={kind(fpga)}) 134 int fn2() { return 30; } 135 136 #pragma omp declare variant(stat_unused_no_emit) match(implementation = {vendor(unknown)}, device = {kind(gpu)}) 137 template <typename T> 138 static T stat_unused_T() { return 31; } 139 140 int bazzzzzzzz() { 141 return stat_unused_T<int>(); 142 } 143 144 #endif // HEADER 145