This is another clause where the parsing does all the required enforcement besides the construct it appertains to, so this patch removes the restriction and adds sufficient test coverage for combined constructs.
79 lines
2.9 KiB
C++
79 lines
2.9 KiB
C++
// RUN: %clang_cc1 %s -fopenacc -ast-dump | FileCheck %s
|
|
|
|
// Test this with PCH.
|
|
// RUN: %clang_cc1 %s -fopenacc -emit-pch -o %t %s
|
|
// RUN: %clang_cc1 %s -fopenacc -include-pch %t -ast-dump-all | FileCheck %s
|
|
|
|
#ifndef PCH_HELPER
|
|
#define PCH_HELPER
|
|
|
|
int Global;
|
|
short GlobalArray[5];
|
|
|
|
void NormalUses(float *PointerParam) {
|
|
// CHECK: FunctionDecl{{.*}}NormalUses
|
|
// CHECK: ParmVarDecl
|
|
// CHECK-NEXT: CompoundStmt
|
|
|
|
#pragma acc parallel loop present(GlobalArray, PointerParam[Global])
|
|
for(int i = 0; i < 5; ++i);
|
|
// CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop
|
|
// CHECK-NEXT: present clause
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'
|
|
// CHECK-NEXT: ArraySubscriptExpr{{.*}}'float' lvalue
|
|
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'float *' <LValueToRValue>
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'float *' lvalue ParmVar{{.*}}'PointerParam' 'float *'
|
|
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'
|
|
// CHECK-NEXT: ForStmt
|
|
// CHECK: NullStmt
|
|
}
|
|
|
|
template<auto &NTTP, typename T>
|
|
void TemplUses(T t) {
|
|
// CHECK-NEXT: FunctionTemplateDecl
|
|
// CHECK-NEXT: NonTypeTemplateParmDecl {{.*}}referenced 'auto &' depth 0 index 0 NTTP
|
|
// CHECK-NEXT: TemplateTypeParmDecl{{.*}}typename depth 0 index 1 T
|
|
// CHECK-NEXT: FunctionDecl{{.*}} TemplUses 'void (T)'
|
|
// CHECK-NEXT: ParmVarDecl{{.*}} referenced t 'T'
|
|
// CHECK-NEXT: CompoundStmt
|
|
|
|
#pragma acc serial loop seq present(NTTP, t)
|
|
for(int i = 0; i < 5; ++i);
|
|
// CHECK-NEXT: OpenACCCombinedConstruct{{.*}} serial loop
|
|
// CHECK-NEXT: seq clause
|
|
// CHECK-NEXT: present clause
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'auto' lvalue NonTypeTemplateParm{{.*}} 'NTTP' 'auto &'
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'
|
|
// CHECK-NEXT: ForStmt
|
|
// CHECK: NullStmt
|
|
|
|
|
|
// Check the instantiated versions of the above.
|
|
// CHECK-NEXT: FunctionDecl{{.*}} used TemplUses 'void (int)' implicit_instantiation
|
|
// CHECK-NEXT: TemplateArgument decl
|
|
// CHECK-NEXT: Var{{.*}} 'CEVar' 'const unsigned int'
|
|
// CHECK-NEXT: TemplateArgument type 'int'
|
|
// CHECK-NEXT: BuiltinType{{.*}} 'int'
|
|
// CHECK-NEXT: ParmVarDecl{{.*}} used t 'int'
|
|
// CHECK-NEXT: CompoundStmt
|
|
|
|
// #pragma acc parallel seq present(NTTP, t)
|
|
// CHECK-NEXT: OpenACCCombinedConstruct{{.*}} serial loop
|
|
// CHECK-NEXT: seq clause
|
|
// CHECK-NEXT: present clause
|
|
// CHECK-NEXT: SubstNonTypeTemplateParmExpr{{.*}}'const unsigned int' lvalue
|
|
// CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} referenced 'auto &' depth 0 index 0 NTTP
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'const unsigned int' lvalue Var{{.*}} 'CEVar' 'const unsigned int'
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'
|
|
// CHECK-NEXT: ForStmt
|
|
// CHECK: NullStmt
|
|
|
|
}
|
|
|
|
void Inst() {
|
|
static constexpr unsigned CEVar = 1;
|
|
TemplUses<CEVar>(5);
|
|
}
|
|
#endif
|