224 lines · cpp
1// RUN: %clang_cc1 -triple=x86_64-pc-win32 -fopenmp \2// RUN: -fsyntax-only -verify %s3 4// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp \5// RUN: -fsyntax-only -verify %s6 7// expected-no-diagnostics8 9// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp \10// RUN: -ast-print %s | FileCheck %s --check-prefix=PRINT11 12// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp \13// RUN: -ast-dump %s | FileCheck %s --check-prefix=DUMP14 15// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp \16// RUN: -emit-pch -o %t %s17 18// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp \19// RUN: -include-pch %t -ast-dump-all %s | FileCheck %s --check-prefix=DUMP20 21// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp \22// RUN: -include-pch %t -ast-print %s | FileCheck %s --check-prefix=PRINT23 24#ifndef HEADER25#define HEADER26 27int foo_gpu(int A, int *B) { return 0;}28//PRINT: #pragma omp declare variant(foo_gpu)29//DUMP: FunctionDecl{{.*}} foo30//DUMP: OMPDeclareVariantAttr {{.*}}Implicit construct{{.*}}31#pragma omp declare variant(foo_gpu) \32 match(construct={dispatch}, device={arch(arm)})33int foo(int, int*);34 35template <typename T, typename TP>36void fooTemp() {37 T a;38 TP b;39 //PRINT: #pragma omp dispatch nowait40 //DUMP: OMPDispatchDirective41 //DUMP: OMPNowaitClause42 #pragma omp dispatch nowait43 foo(a, b);44}45 46int *get_device_ptr();47int get_device();48int other();49 50//DUMP: FunctionDecl{{.*}} test_one51void test_one()52{53 int aaa, bbb, var;54 //PRINT: #pragma omp dispatch depend(in : var) nowait novariants(aaa > 5) nocontext(bbb > 5)55 //DUMP: OMPDispatchDirective56 //DUMP: OMPDependClause57 //DUMP: OMPNowaitClause58 //DUMP: OMPNovariantsClause59 //DUMP: DeclRefExpr {{.*}} 'bool' lvalue OMPCapturedExpr60 //DUMP: OMPNocontextClause61 //DUMP: DeclRefExpr {{.*}} 'bool' lvalue OMPCapturedExpr62 #pragma omp dispatch depend(in:var) nowait novariants(aaa > 5) nocontext(bbb > 5)63 foo(aaa, &bbb);64 65 int *dp = get_device_ptr();66 int dev = get_device();67 //PRINT: #pragma omp dispatch device(dev) is_device_ptr(dp) novariants(dev > 10) nocontext(dev > 5)68 //DUMP: OMPDispatchDirective69 //DUMP: OMPDeviceClause70 //DUMP: OMPIs_device_ptrClause71 //DUMP: OMPNovariantsClause72 //DUMP: DeclRefExpr {{.*}} 'bool' lvalue OMPCapturedExpr73 //DUMP: OMPNocontextClause74 //DUMP: DeclRefExpr {{.*}} 'bool' lvalue OMPCapturedExpr75 #pragma omp dispatch device(dev) is_device_ptr(dp) novariants(dev > 10) nocontext(dev > 5)76 foo(aaa, dp);77 78 //PRINT: #pragma omp dispatch79 //PRINT: foo(other(), &bbb);80 //DUMP: OMPDispatchDirective81 #pragma omp dispatch82 foo(other(), &bbb);83 84 fooTemp<int, int*>();85}86 87struct Obj {88 Obj();89 ~Obj();90 int disp_method_variant1();91 #pragma omp declare variant(disp_method_variant1) \92 match(construct={dispatch}, device={arch(arm)})93 int disp_method1();94 95 static int disp_method_variant2() { return 1; }96 #pragma omp declare variant(disp_method_variant2) \97 match(construct={dispatch}, device={arch(arm)})98 static int disp_method2() { return 2; }99};100 101Obj foo_vari();102#pragma omp declare variant(foo_vari) \103 match(construct={dispatch}, device={arch(arm)})104Obj foo_obj();105 106//DUMP: FunctionDecl{{.*}} test_two107void test_two(Obj o1, Obj &o2, Obj *o3)108{109 //PRINT: #pragma omp dispatch110 //PRINT: o1.disp_method1();111 //DUMP: OMPDispatchDirective112 #pragma omp dispatch113 o1.disp_method1();114 115 //PRINT: #pragma omp dispatch116 //PRINT: o2.disp_method1();117 //DUMP: OMPDispatchDirective118 #pragma omp dispatch119 o2.disp_method1();120 121 //PRINT: #pragma omp dispatch122 //PRINT: o3->disp_method1();123 //DUMP: OMPDispatchDirective124 #pragma omp dispatch125 o3->disp_method1();126 127 //PRINT: #pragma omp dispatch128 //PRINT: Obj::disp_method2();129 //DUMP: OMPDispatchDirective130 #pragma omp dispatch131 Obj::disp_method2();132 133 int ret;134 //PRINT: #pragma omp dispatch135 //PRINT: ret = o1.disp_method1();136 //DUMP: OMPDispatchDirective137 #pragma omp dispatch138 ret = o1.disp_method1();139 140 //PRINT: #pragma omp dispatch141 //PRINT: ret = o2.disp_method1();142 //DUMP: OMPDispatchDirective143 #pragma omp dispatch144 ret = o2.disp_method1();145 146 //PRINT: #pragma omp dispatch147 //PRINT: ret = o3->disp_method1();148 //DUMP: OMPDispatchDirective149 #pragma omp dispatch150 ret = o3->disp_method1();151 152 //PRINT: #pragma omp dispatch153 //PRINT: ret = Obj::disp_method2();154 //DUMP: OMPDispatchDirective155 #pragma omp dispatch156 ret = Obj::disp_method2();157 158 //PRINT: #pragma omp dispatch159 //PRINT: (void)Obj::disp_method2();160 //DUMP: OMPDispatchDirective161 #pragma omp dispatch162 (void)Obj::disp_method2();163 164 // Full C++ operator= case with temps and EH.165 Obj o;166 //PRINT: #pragma omp dispatch167 //PRINT: o = foo_obj();168 //DUMP: OMPDispatchDirective169 #pragma omp dispatch170 o = foo_obj();171}172 173struct A {174 A& disp_operator(A other);175 #pragma omp declare variant(disp_operator) \176 match(construct={dispatch}, device={arch(arm)})177 A& operator=(A other);178};179 180struct Obj2 {181 A xx;182 Obj2& disp_operator(Obj2 other);183 #pragma omp declare variant(disp_operator) \184 match(construct={dispatch}, device={arch(arm)})185 Obj2& operator=(Obj2 other);186 187 void foo() {188 Obj2 z;189 //PRINT: #pragma omp dispatch190 //PRINT: z = z;191 //DUMP: OMPDispatchDirective192 #pragma omp dispatch193 z = z;194 //PRINT: #pragma omp dispatch195 //PRINT: z.operator=(z);196 //DUMP: OMPDispatchDirective197 #pragma omp dispatch198 z.operator=(z);199 }200 void bar() {201 Obj2 j;202 //PRINT: #pragma omp dispatch203 //PRINT: j = {this->xx};204 //DUMP: OMPDispatchDirective205 #pragma omp dispatch206 j = {this->xx};207 //PRINT: #pragma omp dispatch208 //PRINT: j.operator=({this->xx});209 //DUMP: OMPDispatchDirective210 #pragma omp dispatch211 j.operator=({this->xx});212 }213};214 215void test_three()216{217 Obj2 z1, z;218 #pragma omp dispatch219 z1 = z;220 #pragma omp dispatch221 z1.operator=(z);222}223#endif // HEADER224