xref: /llvm-project/clang/test/OpenMP/declare_variant_implementation_vendor_codegen.cpp (revision ff260ad0e014516fbebb4b9f7bcd5e085ac37661)
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 Bataev int foo() { return 2; }
262df5f12eSAlexey Bataev 
272df5f12eSAlexey Bataev #pragma omp declare variant(foo) match(implementation = {vendor(llvm)})
bar()28befb4be3SJohannes Doerfert int bar() { return 3; }
292df5f12eSAlexey Bataev 
302df5f12eSAlexey Bataev int bazzz();
312df5f12eSAlexey Bataev #pragma omp declare variant(bazzz) match(implementation = {vendor(llvm)})
baz()32befb4be3SJohannes Doerfert int baz() { return 4; }
332df5f12eSAlexey Bataev 
342df5f12eSAlexey Bataev int test();
352df5f12eSAlexey Bataev #pragma omp declare variant(test) match(implementation = {vendor(llvm)})
call()36befb4be3SJohannes Doerfert int 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 Doerfert static 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 Doerfert static int stat_used() { return 7; }
452df5f12eSAlexey Bataev 
main()462df5f12eSAlexey Bataev int main() { return bar() + baz() + call() + stat_used(); }
472df5f12eSAlexey Bataev 
test()48befb4be3SJohannes Doerfert int test() { return 8; }
stat_unused_()49befb4be3SJohannes Doerfert static int stat_unused_() { return 9; }
stat_used_()50befb4be3SJohannes Doerfert static 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 Doerfert int 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 Doerfert int SpecSpecialFuncs::method_() { return 15; }
Method()83befb4be3SJohannes Doerfert int SpecSpecialFuncs::Method() { return 16; }
842df5f12eSAlexey Bataev 
xxx()852df5f12eSAlexey Bataev void xxx() {
862df5f12eSAlexey Bataev   (void)s.method();
872df5f12eSAlexey Bataev   (void)s1.method();
882df5f12eSAlexey Bataev }
892df5f12eSAlexey Bataev 
prio()90befb4be3SJohannes Doerfert int prio() { return 17; }
prio1()91befb4be3SJohannes Doerfert int 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 Doerfert int prio_() { return 19; }
960364c760SAlexey Bataev 
prio2()97befb4be3SJohannes Doerfert static int prio2() { return 20; }
prio3()98befb4be3SJohannes Doerfert static int prio3() { return 21; }
prio4()99befb4be3SJohannes Doerfert static 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 Doerfert static int prio1_() { return 23; }
1050364c760SAlexey Bataev 
int_fn()1060364c760SAlexey Bataev int int_fn() { return prio1_(); }
1070364c760SAlexey Bataev 
fn_linkage_variant()108befb4be3SJohannes Doerfert int 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 Doerfert int fn_linkage() { return 25; }
1126b06ead1SAlexey Bataev }
1136b06ead1SAlexey Bataev 
fn_linkage_variant1()114befb4be3SJohannes Doerfert extern "C" int fn_linkage_variant1() { return 26; }
1156b06ead1SAlexey Bataev #pragma omp declare variant(fn_linkage_variant1) match(implementation = {vendor(llvm)})
fn_linkage1()116befb4be3SJohannes Doerfert int fn_linkage1() { return 27; }
1176b06ead1SAlexey Bataev 
fn_variant2()118befb4be3SJohannes Doerfert int fn_variant2() { return 28; }
119303657a6SAlexey Bataev #pragma omp declare variant(fn_variant2) match(implementation = {vendor(llvm, ibm)})
fn2()120befb4be3SJohannes Doerfert int fn2() { return 29; }
121303657a6SAlexey Bataev 
1222df5f12eSAlexey Bataev #endif // HEADER
123