cb424d7448
verify-patch-sanity.py validates every active recipe .patch has internally- consistent hunk line counts — catching the 'malformed patch at line N' failure at commit/CI/preflight time instead of hours into a cook. This cycle hit that class three times (qtwaylandscanner, sddm, xwayland), each only discovered when cookbook tried to apply the patch. Running it across the repo found 29 latent malformed patches (validated against GNU patch: e.g. relibc/P3-sysv-ipc reproduces 'malformed patch at line 22'). They were harmless only because they sit in vendored recipes (baked, not re- applied) — but would fail on any version-bump re-derivation. --fix recounts the hunk headers (body untouched) and repaired all 29. Wired into build-preflight.sh (Phase 1.0D) and redbear-ci.yml, with a unit test (test-patch-sanity.sh). Skips archived/legacy trees and unvalidatable formats (empty placeholders, bare-@@ git hunks).
402 lines
14 KiB
C++
402 lines
14 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;
|
|
// CHECK: VarDecl{{.*}}Global 'int *'
|
|
int GlobalArray[5];
|
|
// CHECK-NEXT: VarDecl{{.*}}GlobalArray 'int[5]'
|
|
#pragma acc declare deviceptr(Global), copyin(readonly, always: GlobalArray)
|
|
// CHECK-NEXT: OpenACCDeclareDecl
|
|
// CHECK-NEXT: deviceptr clause
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int *'
|
|
// CHECK-NEXT: copyin clause modifiers: always, readonly
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'GlobalArray' 'int[5]'
|
|
|
|
int *Global1;
|
|
// CHECK-NEXT: VarDecl{{.*}}Global1 'int *'
|
|
int GlobalArray1[5];
|
|
// CHECK-NEXT: VarDecl{{.*}}GlobalArray1 'int[5]'
|
|
_Pragma("acc declare deviceptr(Global1), copyin(GlobalArray1)")
|
|
// CHECK-NEXT: OpenACCDeclareDecl
|
|
// CHECK-NEXT: deviceptr clause
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'Global1' 'int *'
|
|
// CHECK-NEXT: copyin clause
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'GlobalArray1' 'int[5]'
|
|
|
|
int *Global2;
|
|
// CHECK: VarDecl{{.*}}Global2 'int *'
|
|
int GlobalArray2[5];
|
|
// CHECK-NEXT: VarDecl{{.*}}GlobalArray2 'int[5]'
|
|
#pragma acc declare create(Global2, GlobalArray2)
|
|
// CHECK-NEXT: OpenACCDeclareDecl
|
|
// CHECK-NEXT: create clause
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'Global2' 'int *'
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'GlobalArray2' 'int[5]'
|
|
|
|
int Global3;
|
|
// CHECK: VarDecl{{.*}}Global3 'int'
|
|
int GlobalArray3[5];
|
|
// CHECK-NEXT: VarDecl{{.*}}GlobalArray3 'int[5]'
|
|
#pragma acc declare link(Global3) device_resident(GlobalArray3)
|
|
// CHECK-NEXT: OpenACCDeclareDecl
|
|
// CHECK-NEXT: link clause
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'Global3' 'int'
|
|
// CHECK-NEXT: device_resident clause
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'GlobalArray3' 'int[5]'
|
|
|
|
namespace NS {
|
|
int NSVar;
|
|
// CHECK: VarDecl{{.*}}NSVar 'int'
|
|
int NSArray[5];
|
|
// CHECK-NEXT: VarDecl{{.*}}NSArray 'int[5]'
|
|
#pragma acc declare create(NSVar, NSArray)
|
|
// CHECK-NEXT: OpenACCDeclareDecl
|
|
// CHECK-NEXT: create clause
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'NSVar' 'int'
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'NSArray' 'int[5]'
|
|
}
|
|
|
|
struct Struct {
|
|
// CHECK-NEXT: CXXRecordDecl{{.*}} Struct definition
|
|
// Skip DefinitionData and go right to the definition.
|
|
// CHECK: CXXRecordDecl{{.*}} implicit struct Struct
|
|
static const int StaticMem = 5;
|
|
// CHECK-NEXT: VarDecl {{.*}} StaticMem 'const int' static cinit
|
|
// CHECK-NEXT: IntegerLiteral{{.*}}'int' 5
|
|
static const int StaticMem2 = 5;
|
|
// CHECK-NEXT: VarDecl {{.*}} StaticMem2 'const int' static cinit
|
|
// CHECK-NEXT: IntegerLiteral{{.*}}'int' 5
|
|
static const int StaticMemArray[5];
|
|
// CHECK-NEXT: VarDecl {{.*}} StaticMemArray 'const int[5]' static
|
|
static const int StaticMemArray2[5];
|
|
// CHECK-NEXT: VarDecl {{.*}} StaticMemArray2 'const int[5]' static
|
|
#pragma acc declare copyin(StaticMem, StaticMemArray) create(StaticMem2, StaticMemArray2)
|
|
// CHECK-NEXT: OpenACCDeclareDecl
|
|
// CHECK-NEXT: copyin clause
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'StaticMem' 'const int'
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'StaticMemArray' 'const int[5]'
|
|
// CHECK-NEXT: create clause
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'StaticMem2' 'const int'
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'StaticMemArray2' 'const int[5]'
|
|
|
|
void MemFunc1(int Arg) {
|
|
// CHECK-NEXT: CXXMethodDecl{{.*}}MemFunc1 'void (int)'
|
|
// CHECK-NEXT: ParmVarDecl{{.*}} Arg 'int'
|
|
// CHECK-NEXT: CompoundStmt
|
|
int Local;
|
|
// CHECK-NEXT: DeclStmt
|
|
// CHECK-NEXT: VarDecl{{.*}} Local 'int'
|
|
int LocalArray[5];
|
|
// CHECK-NEXT: DeclStmt
|
|
// CHECK-NEXT: VarDecl{{.*}} LocalArray 'int[5]'
|
|
#pragma acc declare present(Arg, Local, LocalArray)
|
|
// CHECK-NEXT: DeclStmt
|
|
// CHECK-NEXT: OpenACCDeclareDecl
|
|
// CHECK-NEXT: present clause
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'Arg' 'int'
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'Local' 'int'
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'LocalArray' 'int[5]'
|
|
}
|
|
void MemFunc2(int Arg);
|
|
// CHECK: CXXMethodDecl{{.*}}MemFunc2
|
|
};
|
|
void Struct::MemFunc2(int Arg) {
|
|
// CHECK: CXXMethodDecl{{.*}}MemFunc2 'void (int)'
|
|
// CHECK-NEXT: ParmVarDecl{{.*}} Arg 'int'
|
|
// CHECK-NEXT: CompoundStmt
|
|
int Local;
|
|
// CHECK-NEXT: DeclStmt
|
|
// CHECK-NEXT: VarDecl{{.*}} Local 'int'
|
|
int LocalArray[5];
|
|
// CHECK-NEXT: DeclStmt
|
|
// CHECK-NEXT: VarDecl{{.*}} LocalArray 'int[5]'
|
|
#pragma acc declare present(Arg, Local, LocalArray)
|
|
// CHECK-NEXT: DeclStmt
|
|
// CHECK-NEXT: OpenACCDeclareDecl
|
|
// CHECK-NEXT: present clause
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'Arg' 'int'
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'Local' 'int'
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'LocalArray' 'int[5]'
|
|
}
|
|
|
|
void NormalFunc(int Arg) {
|
|
// CHECK-NEXT: FunctionDecl{{.*}}NormalFunc 'void (int)'
|
|
// CHECK-NEXT: ParmVarDecl{{.*}} Arg 'int'
|
|
// CHECK-NEXT: CompoundStmt
|
|
int Local;
|
|
// CHECK-NEXT: DeclStmt
|
|
// CHECK-NEXT: VarDecl{{.*}} Local 'int'
|
|
int LocalArray[5];
|
|
// CHECK-NEXT: DeclStmt
|
|
// CHECK-NEXT: VarDecl{{.*}} LocalArray 'int[5]'
|
|
#pragma acc declare present(Arg, Local, LocalArray)
|
|
// CHECK-NEXT: DeclStmt
|
|
// CHECK-NEXT: OpenACCDeclareDecl
|
|
// CHECK-NEXT: present clause
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'Arg' 'int'
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'Local' 'int'
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'LocalArray' 'int[5]'
|
|
}
|
|
|
|
template<typename T>
|
|
struct DependentStruct {
|
|
// CHECK: ClassTemplateDecl{{.*}}DependentStruct
|
|
// CHECK-NEXT: TemplateTypeParmDecl{{.*}}depth 0 index 0 T
|
|
// CHECK-NEXT: CXXRecordDecl{{.*}}DependentStruct definition
|
|
// CHECK: CXXRecordDecl{{.*}}implicit struct DependentStruct
|
|
static const T StaticMem = 5;
|
|
// CHECK-NEXT: VarDecl{{.*}} StaticMem 'const T' static cinit
|
|
// CHECK-NEXT: IntegerLiteral{{.*}}'int' 5
|
|
static const T StaticMem2 = 5;
|
|
// CHECK-NEXT: VarDecl{{.*}} StaticMem2 'const T' static cinit
|
|
// CHECK-NEXT: IntegerLiteral{{.*}}'int' 5
|
|
static constexpr T StaticMemArray[5] = {};
|
|
// CHECK-NEXT: VarDecl{{.*}} StaticMemArray 'const T[5]'
|
|
// CHECK-NEXT: InitListExpr{{.*}}'void'
|
|
static constexpr T StaticMemArray2[5] = {};
|
|
// CHECK-NEXT: VarDecl{{.*}} StaticMemArray2 'const T[5]'
|
|
// CHECK-NEXT: InitListExpr{{.*}}'void'
|
|
#pragma acc declare copyin(StaticMem, StaticMemArray) create(zero: StaticMem2, StaticMemArray2)
|
|
// CHECK-NEXT: OpenACCDeclareDecl
|
|
// CHECK-NEXT: copyin clause
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'StaticMem' 'const T'
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'StaticMemArray' 'const T[5]'
|
|
// CHECK-NEXT: create clause modifiers: zero
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'StaticMem2' 'const T'
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'StaticMemArray2' 'const T[5]'
|
|
|
|
template<typename U>
|
|
void DepMemFunc1(U Arg, U Arg2) {
|
|
// CHECK-NEXT: FunctionTemplateDecl{{.*}}DepMemFunc1
|
|
// CHECK-NEXT: TemplateTypeParmDecl{{.*}}depth 1 index 0 U
|
|
// CHECK-NEXT: CXXMethodDecl{{.*}}DepMemFunc1 'void (U, U)'
|
|
// CHECK-NEXT: ParmVarDecl{{.*}} Arg 'U'
|
|
// CHECK-NEXT: ParmVarDecl{{.*}} Arg2 'U'
|
|
// CHECK-NEXT: CompoundStmt
|
|
T Local, Local2;
|
|
// CHECK-NEXT: DeclStmt
|
|
// CHECK-NEXT: VarDecl{{.*}} Local 'T'
|
|
// CHECK-NEXT: VarDecl{{.*}} Local2 'T'
|
|
U LocalArray[5];
|
|
// CHECK-NEXT: DeclStmt
|
|
// CHECK-NEXT: VarDecl{{.*}} LocalArray 'U[5]'
|
|
U LocalArray2[5];
|
|
// CHECK-NEXT: DeclStmt
|
|
// CHECK-NEXT: VarDecl{{.*}} LocalArray2 'U[5]'
|
|
#pragma acc declare copy(always, alwaysin: Arg, Local, LocalArray) copyout(zero: Arg2, Local2, LocalArray2)
|
|
// CHECK-NEXT: DeclStmt
|
|
// CHECK-NEXT: OpenACCDeclareDecl
|
|
// CHECK-NEXT: copy clause modifiers: always, alwaysin
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'Arg' 'U'
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'Local' 'T'
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'LocalArray' 'U[5]'
|
|
// CHECK-NEXT: copyout clause modifiers: zero
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'Arg2' 'U'
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'Local2' 'T'
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'LocalArray2' 'U[5]'
|
|
|
|
extern T Local3;
|
|
// CHECK-NEXT: DeclStmt
|
|
// CHECK-NEXT: VarDecl{{.*}} Local3 'T' extern
|
|
T Local4;
|
|
// CHECK-NEXT: DeclStmt
|
|
// CHECK-NEXT: VarDecl{{.*}} Local4 'T'
|
|
#pragma acc declare link(Local3) device_resident(Local4)
|
|
// CHECK-NEXT: DeclStmt
|
|
// CHECK-NEXT: OpenACCDeclareDecl
|
|
// CHECK-NEXT: link clause
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'Local3' 'T'
|
|
// CHECK-NEXT: device_resident clause
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'Local4' 'T'
|
|
}
|
|
template<typename U>
|
|
void DepMemFunc2(U Arg);
|
|
// CHECK-NEXT: FunctionTemplateDecl{{.*}}DepMemFunc2
|
|
// CHECK-NEXT: TemplateTypeParmDecl{{.*}}depth 1 index 0 U
|
|
// CHECK-NEXT: CXXMethodDecl{{.*}}DepMemFunc2 'void (U)'
|
|
// CHECK-NEXT: ParmVarDecl{{.*}} Arg 'U'
|
|
};
|
|
|
|
// Instantiation of class.
|
|
// CHECK-NEXT: ClassTemplateSpecializationDecl{{.*}}DependentStruct definition
|
|
// CHECK: TemplateArgument type 'int'
|
|
// CHECK-NEXT: BuiltinType{{.*}}'int'
|
|
// CHECK-NEXT: CXXRecordDecl{{.*}} struct DependentStruct
|
|
|
|
// CHECK-NEXT: VarDecl{{.*}} StaticMem 'const int'
|
|
// CHECK-NEXT: IntegerLiteral{{.*}}'int' 5
|
|
|
|
// CHECK-NEXT: VarDecl{{.*}} StaticMem2 'const int'
|
|
// CHECK-NEXT: IntegerLiteral{{.*}}'int' 5
|
|
//
|
|
// CHECK-NEXT: VarDecl{{.*}} StaticMemArray 'const int[5]'
|
|
// CHECK-NEXT: value: Array size=5
|
|
// CHECK-NEXT: filler: 5 x Int 0
|
|
// CHECK-NEXT: InitListExpr{{.*}} 'const int[5]'
|
|
// CHECK-NEXT: array_filler
|
|
|
|
// CHECK-NEXT: VarDecl{{.*}} StaticMemArray2 'const int[5]'
|
|
// CHECK-NEXT: value: Array size=5
|
|
// CHECK-NEXT: filler: 5 x Int 0
|
|
// CHECK-NEXT: InitListExpr{{.*}} 'const int[5]'
|
|
// CHECK-NEXT: array_filler
|
|
|
|
// CHECK-NEXT: OpenACCDeclareDecl
|
|
// CHECK-NEXT: copyin clause
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'StaticMem' 'const int'
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'StaticMemArray' 'const int[5]'
|
|
// CHECK-NEXT: create clause modifiers: zero
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'StaticMem2' 'const int'
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'StaticMemArray2' 'const int[5]'
|
|
|
|
// CHECK-NEXT: FunctionTemplateDecl{{.*}} DepMemFunc1
|
|
// CHECK-NEXT: TemplateTypeParmDecl{{.*}}depth 0 index 0 U
|
|
// CHECK-NEXT: CXXMethodDecl{{.*}}DepMemFunc1 'void (U, U)'
|
|
// CHECK-NEXT: ParmVarDecl{{.*}} Arg 'U'
|
|
// CHECK-NEXT: ParmVarDecl{{.*}} Arg2 'U'
|
|
// CHECK-NEXT: CXXMethodDecl{{.*}}DepMemFunc1 'void (float, float)'
|
|
// CHECK-NEXT: TemplateArgument type 'float'
|
|
// CHECK-NEXT: BuiltinType{{.*}}'float'
|
|
// CHECK-NEXT: ParmVarDecl{{.*}} Arg 'float'
|
|
// CHECK-NEXT: ParmVarDecl{{.*}} Arg2 'float'
|
|
// CHECK-NEXT: CompoundStmt
|
|
|
|
// CHECK-NEXT: DeclStmt
|
|
// CHECK-NEXT: VarDecl{{.*}} Local 'int'
|
|
// CHECK-NEXT: VarDecl{{.*}} Local2 'int'
|
|
|
|
// CHECK-NEXT: DeclStmt
|
|
// CHECK-NEXT: VarDecl{{.*}} LocalArray 'float[5]'
|
|
|
|
// CHECK-NEXT: DeclStmt
|
|
// CHECK-NEXT: VarDecl{{.*}} LocalArray2 'float[5]'
|
|
|
|
// CHECK-NEXT: DeclStmt
|
|
// CHECK-NEXT: OpenACCDeclareDecl
|
|
// CHECK-NEXT: copy clause modifiers: always, alwaysin
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'Arg' 'float'
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'Local' 'int'
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'LocalArray' 'float[5]'
|
|
// CHECK-NEXT: copyout clause modifiers: zero
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'Arg2' 'float'
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'Local2' 'int'
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'LocalArray2' 'float[5]'
|
|
|
|
// CHECK-NEXT: DeclStmt
|
|
// CHECK-NEXT: VarDecl{{.*}} Local3 'int' extern
|
|
// CHECK-NEXT: DeclStmt
|
|
// CHECK-NEXT: VarDecl{{.*}} Local4 'int'
|
|
// CHECK-NEXT: DeclStmt
|
|
// CHECK-NEXT: OpenACCDeclareDecl
|
|
// CHECK-NEXT: link clause
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'Local3' 'int'
|
|
// CHECK-NEXT: device_resident clause
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'Local4' 'int'
|
|
|
|
// CHECK-NEXT: FunctionTemplateDecl{{.*}}DepMemFunc2
|
|
// CHECK-NEXT: TemplateTypeParmDecl{{.*}}depth 0 index 0 U
|
|
// CHECK-NEXT: CXXMethodDecl{{.*}}DepMemFunc2 'void (U)'
|
|
// CHECK-NEXT: ParmVarDecl{{.*}} Arg 'U'
|
|
// CHECK-NEXT: CXXMethodDecl{{.*}}DepMemFunc2 'void (float)'
|
|
// CHECK-NEXT: TemplateArgument type 'float'
|
|
// CHECK-NEXT: BuiltinType{{.*}}'float'
|
|
// CHECK-NEXT: ParmVarDecl{{.*}} Arg 'float'
|
|
// CHECK-NEXT: CompoundStmt
|
|
|
|
// CHECK-NEXT: DeclStmt
|
|
// CHECK-NEXT: VarDecl{{.*}} Local 'int'
|
|
|
|
// CHECK-NEXT: DeclStmt
|
|
// CHECK-NEXT: VarDecl{{.*}} LocalArray 'float[5]'
|
|
|
|
// CHECK-NEXT: DeclStmt
|
|
// CHECK-NEXT: OpenACCDeclareDecl
|
|
// CHECK-NEXT: present clause
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'Arg' 'float'
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'Local' 'int'
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'LocalArray' 'float[5]'
|
|
|
|
template<typename T>
|
|
template<typename U>
|
|
void DependentStruct<T>::DepMemFunc2(U Arg) {
|
|
// CHECK: FunctionTemplateDecl{{.*}} DepMemFunc2
|
|
// CHECK-NEXT: TemplateTypeParmDecl{{.*}}depth 1 index 0 U
|
|
// CHECK-NEXT: CXXMethodDecl{{.*}}DepMemFunc2 'void (U)'
|
|
// CHECK-NEXT: ParmVarDecl{{.*}} Arg 'U'
|
|
// CHECK-NEXT: CompoundStmt
|
|
T Local;
|
|
// CHECK-NEXT: DeclStmt
|
|
// CHECK-NEXT: VarDecl{{.*}} Local 'T'
|
|
U LocalArray[5];
|
|
// CHECK-NEXT: DeclStmt
|
|
// CHECK-NEXT: VarDecl{{.*}} LocalArray 'U[5]'
|
|
#pragma acc declare present(Arg, Local, LocalArray)
|
|
// CHECK-NEXT: DeclStmt
|
|
// CHECK-NEXT: OpenACCDeclareDecl
|
|
// CHECK-NEXT: present clause
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'Arg' 'U'
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'Local' 'T'
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'LocalArray' 'U[5]'
|
|
}
|
|
|
|
template<typename T, unsigned Size>
|
|
void DependentFunc(T Arg) {
|
|
// CHECK: FunctionTemplateDecl{{.*}} DependentFunc
|
|
// CHECK-NEXT: TemplateTypeParmDecl{{.*}}depth 0 index 0 T
|
|
// CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} depth 0 index 1 Size
|
|
// CHECK-NEXT: FunctionDecl{{.*}}DependentFunc 'void (T)'
|
|
// CHECK-NEXT: ParmVarDecl{{.*}} Arg 'T'
|
|
// CHECK-NEXT: CompoundStmt
|
|
T Local;
|
|
// CHECK-NEXT: DeclStmt
|
|
// CHECK-NEXT: VarDecl{{.*}} Local 'T'
|
|
T LocalArray[Size];
|
|
// CHECK-NEXT: DeclStmt
|
|
// CHECK-NEXT: VarDecl{{.*}} LocalArray 'T[Size]'
|
|
|
|
#pragma acc declare present(Arg, Local, LocalArray)
|
|
// CHECK-NEXT: DeclStmt
|
|
// CHECK-NEXT: OpenACCDeclareDecl
|
|
// CHECK-NEXT: present clause
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'Arg' 'T'
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'Local' 'T'
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'LocalArray' 'T[Size]'
|
|
|
|
// Instantiation:
|
|
// CHECK-NEXT: FunctionDecl{{.*}} DependentFunc 'void (int)'
|
|
// CHECK-NEXT: TemplateArgument type 'int'
|
|
// CHECK-NEXT: BuiltinType{{.*}}'int'
|
|
// CHECK-NEXT: TemplateArgument integral '5U'
|
|
// CHECK-NEXT: ParmVarDecl{{.*}} Arg 'int'
|
|
// CHECK-NEXT: CompoundStmt
|
|
|
|
// CHECK-NEXT: DeclStmt
|
|
// CHECK-NEXT: VarDecl{{.*}} Local 'int'
|
|
|
|
// CHECK-NEXT: DeclStmt
|
|
// CHECK-NEXT: VarDecl{{.*}} LocalArray 'int[5]'
|
|
|
|
// CHECK-NEXT: DeclStmt
|
|
// CHECK-NEXT: OpenACCDeclareDecl
|
|
// CHECK-NEXT: present clause
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'Arg' 'int'
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'Local' 'int'
|
|
// CHECK-NEXT: DeclRefExpr{{.*}}'LocalArray' 'int[5]'
|
|
}
|
|
|
|
void use() {
|
|
float i;
|
|
DependentStruct<int> S;
|
|
S.DepMemFunc1(i, i);
|
|
S.DepMemFunc2(i);
|
|
DependentFunc<int, 5>(i);
|
|
}
|
|
|
|
#endif // PCH_HELPER
|