12bfce22aSSaiyedul Islam // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple %itanium_abi_triple -emit-llvm %s -fexceptions -fcxx-exceptions -o - -fsanitize-address-use-after-scope -fopenmp-version=45 | FileCheck %s --implicit-check-not='ret i32 {{6|7|8|9|10|12|13|14|15|19|21|22|23|24}}' 2*ff260ad0SSaiyedul Islam // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple %itanium_abi_triple -fexceptions -fcxx-exceptions -emit-pch -o %t %s 3*ff260ad0SSaiyedul Islam // RUN: %clang_cc1 -fopenmp -x c++ -triple %itanium_abi_triple -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --implicit-check-not='ret i32 {{6|7|8|9|10|12|13|14|15|19|21|22|23|24}}' 42df5f12eSAlexey Bataev // expected-no-diagnostics 52df5f12eSAlexey Bataev 62df5f12eSAlexey Bataev // CHECK-DAG: ret i32 2 72df5f12eSAlexey Bataev // CHECK-DAG: ret i32 3 8befb4be3SJohannes Doerfert // CHECK-DAG: ret i32 4 92df5f12eSAlexey Bataev // CHECK-DAG: ret i32 5 10befb4be3SJohannes Doerfert // CHECK-DAG: ret i32 11 11befb4be3SJohannes Doerfert // CHECK-DAG: ret i32 16 12befb4be3SJohannes Doerfert // CHECK-DAG: ret i32 17 13befb4be3SJohannes Doerfert // CHECK-DAG: ret i32 18 14befb4be3SJohannes Doerfert // CHECK-DAG: ret i32 19 15befb4be3SJohannes Doerfert // CHECK-DAG: ret i32 20 16befb4be3SJohannes Doerfert // CHECK-DAG: ret i32 25 17befb4be3SJohannes Doerfert // CHECK-DAG: ret i32 26 18befb4be3SJohannes Doerfert // CHECK-DAG: ret i32 27 19befb4be3SJohannes Doerfert // CHECK-DAG: ret i32 28 20befb4be3SJohannes Doerfert // CHECK-DAG: ret i32 29 212df5f12eSAlexey Bataev 222df5f12eSAlexey Bataev #ifndef HEADER 232df5f12eSAlexey Bataev #define HEADER 242df5f12eSAlexey Bataev foo()252df5f12eSAlexey Bataevint foo() { return 2; } 262df5f12eSAlexey Bataev 272df5f12eSAlexey Bataev #pragma omp declare variant(foo) match(implementation = {vendor(llvm)}) bar()28befb4be3SJohannes Doerfertint bar() { return 3; } 292df5f12eSAlexey Bataev 302df5f12eSAlexey Bataev int bazzz(); 312df5f12eSAlexey Bataev #pragma omp declare variant(bazzz) match(implementation = {vendor(llvm)}) baz()32befb4be3SJohannes Doerfertint baz() { return 4; } 332df5f12eSAlexey Bataev 342df5f12eSAlexey Bataev int test(); 352df5f12eSAlexey Bataev #pragma omp declare variant(test) match(implementation = {vendor(llvm)}) call()36befb4be3SJohannes Doerfertint call() { return 5; } 372df5f12eSAlexey Bataev 382df5f12eSAlexey Bataev static int stat_unused_(); 392df5f12eSAlexey Bataev #pragma omp declare variant(stat_unused_) match(implementation = {vendor(llvm)}) stat_unused()40befb4be3SJohannes Doerfertstatic int stat_unused() { return 6; } 412df5f12eSAlexey Bataev 422df5f12eSAlexey Bataev static int stat_used_(); 432df5f12eSAlexey Bataev #pragma omp declare variant(stat_used_) match(implementation = {vendor(llvm)}) stat_used()44befb4be3SJohannes Doerfertstatic int stat_used() { return 7; } 452df5f12eSAlexey Bataev main()462df5f12eSAlexey Bataevint main() { return bar() + baz() + call() + stat_used(); } 472df5f12eSAlexey Bataev test()48befb4be3SJohannes Doerfertint test() { return 8; } stat_unused_()49befb4be3SJohannes Doerfertstatic int stat_unused_() { return 9; } stat_used_()50befb4be3SJohannes Doerfertstatic int stat_used_() { return 10; } 512df5f12eSAlexey Bataev 522df5f12eSAlexey Bataev struct SpecialFuncs { vdSpecialFuncs532df5f12eSAlexey Bataev void vd() {} 542df5f12eSAlexey Bataev SpecialFuncs(); 552df5f12eSAlexey Bataev ~SpecialFuncs(); 562df5f12eSAlexey Bataev method_SpecialFuncs57befb4be3SJohannes Doerfert int method_() { return 11; } 582df5f12eSAlexey Bataev #pragma omp declare variant(SpecialFuncs::method_) \ 592df5f12eSAlexey Bataev match(implementation = {vendor(llvm)}) methodSpecialFuncs60befb4be3SJohannes Doerfert int method() { return 12; } 612df5f12eSAlexey Bataev #pragma omp declare variant(SpecialFuncs::method_) \ 622df5f12eSAlexey Bataev match(implementation = {vendor(llvm)}) 632df5f12eSAlexey Bataev int Method(); 642df5f12eSAlexey Bataev } s; 652df5f12eSAlexey Bataev Method()66befb4be3SJohannes Doerfertint SpecialFuncs::Method() { return 13; } 672df5f12eSAlexey Bataev 682df5f12eSAlexey Bataev struct SpecSpecialFuncs { vdSpecSpecialFuncs692df5f12eSAlexey Bataev void vd() {} 702df5f12eSAlexey Bataev SpecSpecialFuncs(); 712df5f12eSAlexey Bataev ~SpecSpecialFuncs(); 722df5f12eSAlexey Bataev 732df5f12eSAlexey Bataev int method_(); 742df5f12eSAlexey Bataev #pragma omp declare variant(SpecSpecialFuncs::method_) \ 752df5f12eSAlexey Bataev match(implementation = {vendor(llvm)}) methodSpecSpecialFuncs76befb4be3SJohannes Doerfert int method() { return 14; } 772df5f12eSAlexey Bataev #pragma omp declare variant(SpecSpecialFuncs::method_) \ 782df5f12eSAlexey Bataev match(implementation = {vendor(llvm)}) 792df5f12eSAlexey Bataev int Method(); 802df5f12eSAlexey Bataev } s1; 812df5f12eSAlexey Bataev method_()82befb4be3SJohannes Doerfertint SpecSpecialFuncs::method_() { return 15; } Method()83befb4be3SJohannes Doerfertint SpecSpecialFuncs::Method() { return 16; } 842df5f12eSAlexey Bataev xxx()852df5f12eSAlexey Bataevvoid xxx() { 862df5f12eSAlexey Bataev (void)s.method(); 872df5f12eSAlexey Bataev (void)s1.method(); 882df5f12eSAlexey Bataev } 892df5f12eSAlexey Bataev prio()90befb4be3SJohannes Doerfertint prio() { return 17; } prio1()91befb4be3SJohannes Doerfertint prio1() { return 18; } 920364c760SAlexey Bataev 930364c760SAlexey Bataev #pragma omp declare variant(prio) match(implementation = {vendor(llvm)}) 940364c760SAlexey Bataev #pragma omp declare variant(prio1) match(implementation = {vendor(score(1): llvm)}) prio_()95befb4be3SJohannes Doerfertint prio_() { return 19; } 960364c760SAlexey Bataev prio2()97befb4be3SJohannes Doerfertstatic int prio2() { return 20; } prio3()98befb4be3SJohannes Doerfertstatic int prio3() { return 21; } prio4()99befb4be3SJohannes Doerfertstatic int prio4() { return 22; } 1000364c760SAlexey Bataev 1010364c760SAlexey Bataev #pragma omp declare variant(prio4) match(implementation = {vendor(score(3): llvm)}) 1020364c760SAlexey Bataev #pragma omp declare variant(prio2) match(implementation = {vendor(score(5): llvm)}) 1030364c760SAlexey Bataev #pragma omp declare variant(prio3) match(implementation = {vendor(score(1): llvm)}) prio1_()104befb4be3SJohannes Doerfertstatic int prio1_() { return 23; } 1050364c760SAlexey Bataev int_fn()1060364c760SAlexey Bataevint int_fn() { return prio1_(); } 1070364c760SAlexey Bataev fn_linkage_variant()108befb4be3SJohannes Doerfertint fn_linkage_variant() { return 24; } 1096b06ead1SAlexey Bataev extern "C" { 1106b06ead1SAlexey Bataev #pragma omp declare variant(fn_linkage_variant) match(implementation = {vendor(llvm)}) fn_linkage()111befb4be3SJohannes Doerfertint fn_linkage() { return 25; } 1126b06ead1SAlexey Bataev } 1136b06ead1SAlexey Bataev fn_linkage_variant1()114befb4be3SJohannes Doerfertextern "C" int fn_linkage_variant1() { return 26; } 1156b06ead1SAlexey Bataev #pragma omp declare variant(fn_linkage_variant1) match(implementation = {vendor(llvm)}) fn_linkage1()116befb4be3SJohannes Doerfertint fn_linkage1() { return 27; } 1176b06ead1SAlexey Bataev fn_variant2()118befb4be3SJohannes Doerfertint fn_variant2() { return 28; } 119303657a6SAlexey Bataev #pragma omp declare variant(fn_variant2) match(implementation = {vendor(llvm, ibm)}) fn2()120befb4be3SJohannes Doerfertint fn2() { return 29; } 121303657a6SAlexey Bataev 1222df5f12eSAlexey Bataev #endif // HEADER 123