227 lines · cpp
1// RUN: %clang_cc1 %s -fopenacc -ast-dump | FileCheck %s2 3// Test this with PCH.4// RUN: %clang_cc1 %s -fopenacc -emit-pch -o %t %s5// RUN: %clang_cc1 %s -fopenacc -include-pch %t -ast-dump-all | FileCheck %s6#ifndef PCH_HELPER7#define PCH_HELPER8 9int Global;10short GlobalArray[5];11 12void NormalUses(float *PointerParam) {13 // CHECK: FunctionDecl{{.*}}NormalUses14 // CHECK: ParmVarDecl15 // CHECK-NEXT: CompoundStmt16 17#pragma acc parallel loop private(Global, GlobalArray[2])18 for (int i = 5; i < 10; ++i);19 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop20 // CHECK-NEXT: private clause21 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'22 // CHECK-NEXT: ArraySubscriptExpr{{.*}}'short' lvalue23 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'short *' <ArrayToPointerDecay>24 // CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'25 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 226 // CHECK-NEXT: ForStmt27 // CHECK: NullStmt28 29#pragma acc serial loop private(GlobalArray, PointerParam[Global])30 for (int i = 5; i < 10; ++i);31 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} serial loop32 // CHECK-NEXT: private clause33 // CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'34 // CHECK-NEXT: ArraySubscriptExpr{{.*}}'float' lvalue35 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float *' <LValueToRValue>36 // CHECK-NEXT: DeclRefExpr{{.*}}'float *' lvalue ParmVar{{.*}}'PointerParam' 'float *'37 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>38 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'39 // CHECK-NEXT: ForStmt40 // CHECK: NullStmt41 42#pragma acc parallel loop firstprivate(GlobalArray, PointerParam[Global])43 for (int i = 5; i < 10; ++i);44 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop45 // CHECK-NEXT: firstprivate clause46 // CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'47 // CHECK-NEXT: ArraySubscriptExpr{{.*}}'float' lvalue48 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float *' <LValueToRValue>49 // CHECK-NEXT: DeclRefExpr{{.*}}'float *' lvalue ParmVar{{.*}}'PointerParam' 'float *'50 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>51 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'52 // CHECK-NEXT: ForStmt53 // CHECK: NullStmt54 55#pragma acc serial loop firstprivate(GlobalArray, PointerParam[Global : Global])56 for (int i = 5; i < 10; ++i);57 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} serial loop58 // CHECK-NEXT: firstprivate clause59 // CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'60 // CHECK-NEXT: ArraySectionExpr61 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float *' <LValueToRValue>62 // CHECK-NEXT: DeclRefExpr{{.*}}'float *' lvalue ParmVar{{.*}} 'PointerParam' 'float *'63 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>64 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'65 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>66 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'67 // CHECK-NEXT: ForStmt68 // CHECK: NullStmt69 70}71template<auto &NTTP, typename T, typename U>72void TemplUses(T t, U u, T*PointerParam) {73 74 // CHECK: FunctionTemplateDecl{{.*}}TemplUses75 // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}}referenced 'auto &' depth 0 index 0 NTTP76 // CHECK-NEXT: TemplateTypeParmDecl{{.*}}typename depth 0 index 1 T77 // CHECK-NEXT: TemplateTypeParmDecl{{.*}}typename depth 0 index 2 U78 // CHECK-NEXT: FunctionDecl{{.*}} TemplUses 'void (T, U, T *)'79 // CHECK-NEXT: ParmVarDecl{{.*}} referenced t 'T'80 // CHECK-NEXT: ParmVarDecl{{.*}} referenced u 'U'81 // CHECK-NEXT: ParmVarDecl{{.*}} referenced PointerParam 'T *'82 // CHECK-NEXT: CompoundStmt83#pragma acc serial loop private(GlobalArray, PointerParam[Global])84 for (int i = 5; i < 10; ++i);85 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} serial loop86 // CHECK-NEXT: private clause87 // CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'88 // CHECK-NEXT: ArraySubscriptExpr{{.*}}'T' lvalue89 // CHECK-NEXT: DeclRefExpr{{.*}}'T *' lvalue ParmVar{{.*}}'PointerParam' 'T *'90 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'91 // CHECK-NEXT: ForStmt92 // CHECK: NullStmt93 94#pragma acc kernels loop private(t, u)95 for (int i = 5; i < 10; ++i);96 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} kernels loop97 // CHECK-NEXT: private clause98 // CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'99 // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'100 // CHECK-NEXT: ForStmt101 // CHECK: NullStmt102 103#pragma acc parallel loop firstprivate(t, u)104 for (int i = 5; i < 10; ++i);105 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop106 // CHECK-NEXT: firstprivate clause107 // CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'108 // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'109 // CHECK-NEXT: ForStmt110 // CHECK: NullStmt111 112#pragma acc kernels loop private(t) private(u)113 for (int i = 5; i < 10; ++i);114 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} kernels loop115 // CHECK-NEXT: private clause116 // CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'117 // CHECK-NEXT: private clause118 // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'119 // CHECK-NEXT: ForStmt120 // CHECK: NullStmt121 122#pragma acc kernels loop private(t) private(NTTP, u)123 for (int i = 5; i < 10; ++i);124 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} kernels loop125 // CHECK-NEXT: private clause126 // CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'127 // CHECK-NEXT: private clause128 // CHECK-NEXT: DeclRefExpr{{.*}}'auto' lvalue NonTypeTemplateParm{{.*}} 'NTTP' 'auto &'129 // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'130 // CHECK-NEXT: ForStmt131 // CHECK: NullStmt132 133#pragma acc parallel loop private(t) firstprivate(NTTP, u)134 for (int i = 5; i < 10; ++i);135 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop136 // CHECK-NEXT: private clause137 // CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'138 // CHECK-NEXT: firstprivate clause139 // CHECK-NEXT: DeclRefExpr{{.*}}'auto' lvalue NonTypeTemplateParm{{.*}} 'NTTP' 'auto &'140 // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'141 // CHECK-NEXT: ForStmt142 // CHECK: NullStmt143 144 // Check the instantiated versions of the above.145 // CHECK-NEXT: FunctionDecl{{.*}} used TemplUses 'void (int, int *, int *)' implicit_instantiation146 // CHECK-NEXT: TemplateArgument decl147 // CHECK-NEXT: Var{{.*}} 'CEVar' 'const unsigned int'148 // CHECK-NEXT: TemplateArgument type 'int'149 // CHECK-NEXT: BuiltinType{{.*}} 'int'150 // CHECK-NEXT: TemplateArgument type 'int[1]'151 // CHECK-NEXT: ConstantArrayType{{.*}} 'int[1]'{{.*}} 1152 // CHECK-NEXT: BuiltinType{{.*}} 'int'153 // CHECK-NEXT: ParmVarDecl{{.*}} used t 'int'154 // CHECK-NEXT: ParmVarDecl{{.*}} used u 'int *'155 // CHECK-NEXT: ParmVarDecl{{.*}} used PointerParam 'int *'156 // CHECK-NEXT: CompoundStmt157 158// #pragma acc serial loop private(GlobalArray, PointerParam[Global])159 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} serial loop160 // CHECK-NEXT: private clause161 // CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'162 // CHECK-NEXT: ArraySubscriptExpr{{.*}}'int' lvalue163 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <LValueToRValue>164 // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}}'PointerParam' 'int *'165 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>166 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'167 // CHECK-NEXT: ForStmt168 // CHECK: NullStmt169 170// #pragma acc kernels loop private(t, u)171 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} kernels loop172 // CHECK-NEXT: private clause173 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'174 // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'175 // CHECK-NEXT: ForStmt176 // CHECK: NullStmt177 178// #pragma acc parallel loop firstprivate(t, u)179 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop180 // CHECK-NEXT: firstprivate clause181 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'182 // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'183 // CHECK-NEXT: ForStmt184 // CHECK: NullStmt185 186// #pragma acc kernels loop private(t) private(u)187 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} kernels loop188 // CHECK-NEXT: private clause189 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'190 // CHECK-NEXT: private clause191 // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'192 // CHECK-NEXT: ForStmt193 // CHECK: NullStmt194 195// #pragma acc kernels loop private(t) private(NTTP, u)196 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} kernels loop197 // CHECK-NEXT: private clause198 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'199 // CHECK-NEXT: private clause200 // CHECK-NEXT: SubstNonTypeTemplateParmExpr{{.*}}'const unsigned int' lvalue201 // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} referenced 'auto &' depth 0 index 0 NTTP202 // CHECK-NEXT: DeclRefExpr{{.*}}'const unsigned int' lvalue Var{{.*}} 'CEVar' 'const unsigned int'203 // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'204 // CHECK-NEXT: ForStmt205 // CHECK: NullStmt206 207// #pragma acc parallel loop private(t) firstprivate(NTTP, u)208 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop209 // CHECK-NEXT: private clause210 // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'211 // CHECK-NEXT: firstprivate clause212 // CHECK-NEXT: SubstNonTypeTemplateParmExpr{{.*}}'const unsigned int' lvalue213 // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} referenced 'auto &' depth 0 index 0 NTTP214 // CHECK-NEXT: DeclRefExpr{{.*}}'const unsigned int' lvalue Var{{.*}} 'CEVar' 'const unsigned int'215 // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'216 // CHECK-NEXT: ForStmt217 // CHECK: NullStmt218}219 220void Inst() {221 static constexpr unsigned CEVar = 1;222 int i;223 int Arr[5];224 TemplUses<CEVar, int, int[1]>({}, {}, &i);225}226#endif // PCH_HELPER227