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).
545 lines
19 KiB
C++
545 lines
19 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
|
|
|
|
auto Lambda = [](){};
|
|
#pragma acc routine(Lambda) worker nohost bind("string")
|
|
// CHECK: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'Lambda' '(lambda at
|
|
// CHECK-NEXT: worker clause
|
|
// CHECK-NEXT: nohost clause
|
|
// CHECK-NEXT: bind clause
|
|
// CHECK-NEXT: StringLiteral{{.*}} "string"
|
|
|
|
int function();
|
|
#pragma acc routine (function) nohost vector bind(identifier)
|
|
// CHECK: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'function' 'int ()'
|
|
// CHECK-NEXT: nohost clause
|
|
// CHECK-NEXT: vector clause
|
|
// CHECK-NEXT: bind clause identifier 'identifier'
|
|
|
|
#pragma acc routine(function) device_type(acc_device_nvidia) seq
|
|
// CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'function' 'int ()'
|
|
// CHECK-NEXT: device_type(acc_device_nvidia)
|
|
// CHECK-NEXT: seq clause
|
|
#pragma acc routine(function) nohost dtype(nvidia) vector
|
|
// CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'function' 'int ()'
|
|
// CHECK-NEXT: nohost clause
|
|
// CHECK-NEXT: dtype(nvidia)
|
|
// CHECK-NEXT: vector clause
|
|
|
|
#pragma acc routine nohost vector
|
|
int function2();
|
|
// CHECK: FunctionDecl{{.*}} function2
|
|
// CHECK-NEXT: OpenACCRoutineDeclAttr
|
|
// CHECK-NEXT: nohost clause
|
|
// CHECK-NEXT: vector clause
|
|
|
|
#pragma acc routine worker nohost bind("asdf")
|
|
auto Lambda2 = [](){};
|
|
// CHECK: VarDecl{{.*}} Lambda2 '(lambda at
|
|
// CHECK: CXXMethodDecl{{.*}} operator()
|
|
// CHECK-NEXT: CompoundStmt
|
|
// CHECK-NEXT: OpenACCRoutineDeclAttr
|
|
// CHECK-NEXT: worker clause
|
|
// CHECK-NEXT: nohost clause
|
|
// CHECK-NEXT: bind clause
|
|
// CHECK-NEXT: StringLiteral{{.*}}"asdf"
|
|
|
|
#pragma acc routine worker nohost bind("asdf")
|
|
auto Lambda3 = [](auto a){ return a;};
|
|
// CHECK: VarDecl{{.*}} Lambda3 '(lambda at
|
|
// CHECK-NEXT: LambdaExpr
|
|
// CHECK-NEXT: CXXRecordDecl
|
|
// CHECK: FunctionTemplateDecl{{.*}} operator()
|
|
// CHECK-NEXT: TemplateTypeParmDecl
|
|
// CHECK-NEXT: CXXMethodDecl{{.*}} operator() 'auto (auto) const'
|
|
// CHECK-NEXT: ParmVarDecl{{.*}}'auto'
|
|
// CHECK-NEXT: CompoundStmt
|
|
// CHECK-NEXT: ReturnStmt
|
|
// CHECK-NEXT: DeclRefExpr
|
|
// CHECK: OpenACCRoutineDeclAttr
|
|
// CHECK-NEXT: worker clause
|
|
// CHECK-NEXT: nohost clause
|
|
// CHECK-NEXT: bind clause
|
|
// CHECK-NEXT: StringLiteral{{.*}}"asdf"
|
|
// CHECK-NEXT: CXXMethodDecl{{.*}}operator() 'int (int) const'{{.*}} implicit_instantiation
|
|
// CHECK-NEXT: TemplateArgument type 'int'
|
|
// CHECK-NEXT: BuiltinType
|
|
// CHECK-NEXT: ParmVarDecl{{.*}}'int'
|
|
// CHECK-NEXT: CompoundStmt
|
|
// CHECK-NEXT: ReturnStmt
|
|
// CHECK-NEXT: ImplicitCastExpr
|
|
// CHECK-NEXT: DeclRefExpr
|
|
// CHECK-NEXT: OpenACCRoutineDeclAttr
|
|
// CHECK-NEXT: worker clause
|
|
// CHECK-NEXT: nohost clause
|
|
// CHECK-NEXT: bind clause
|
|
// CHECK-NEXT: StringLiteral{{.*}}"asdf"
|
|
|
|
int InstL3 = Lambda3(1);
|
|
|
|
namespace NS {
|
|
int NSFunc();
|
|
auto Lambda = [](){};
|
|
}
|
|
#pragma acc routine(NS::NSFunc) seq
|
|
// CHECK: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'NSFunc' 'int ()'
|
|
// CHECK-NEXT: NestedNameSpecifier{{.*}} 'NS'
|
|
// CHECK-NEXT: seq clause
|
|
#pragma acc routine(NS::Lambda) gang
|
|
// CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'Lambda' 'NS::(lambda at
|
|
// CHECK-NEXT: NestedNameSpecifier{{.*}} 'NS'
|
|
// CHECK-NEXT: gang clause
|
|
|
|
constexpr int getInt() { return 1; }
|
|
|
|
struct S {
|
|
void MemFunc();
|
|
#pragma acc routine gang(dim: 1)
|
|
void MemFunc2();
|
|
// CHECK: CXXMethodDecl{{.*}}MemFunc2
|
|
// CHECK-NEXT: OpenACCRoutineDeclAttr{{.*}}
|
|
// CHECK-NEXT: gang clause
|
|
// CHECK-NEXT: ConstantExpr{{.*}}'int'
|
|
// CHECK-NEXT: value: Int 1
|
|
static void StaticMemFunc();
|
|
#pragma acc routine gang(dim: getInt())
|
|
static void StaticMemFunc2();
|
|
// CHECK: CXXMethodDecl{{.*}}StaticMemFunc2
|
|
// CHECK-NEXT: OpenACCRoutineDeclAttr{{.*}}
|
|
// CHECK-NEXT: gang clause
|
|
// CHECK-NEXT: ConstantExpr{{.*}}'int'
|
|
// CHECK-NEXT: value: Int 1
|
|
constexpr static auto Lambda = [](){ return 1; };
|
|
#pragma acc routine worker
|
|
constexpr static auto Lambda2 = [](){ return 1; };
|
|
// CHECK: VarDecl{{.*}}Lambda2 'const S::(lambda at
|
|
// CHECK-NEXT: value: Struct
|
|
// CHECK-NEXT: ImplicitCastExpr
|
|
// CHECK-NEXT: LambdaExpr
|
|
// CHECK-NEXT: CXXRecordDecl
|
|
// CHECK: CXXMethodDecl{{.*}} operator() 'int () const'
|
|
// CHECK-NEXT: CompoundStmt
|
|
// CHECK-NEXT: ReturnStmt
|
|
// CHECK-NEXT: IntegerLiteral
|
|
// CHECK: OpenACCRoutineDeclAttr{{.*}}
|
|
// CHECK-NEXT: worker clause
|
|
|
|
#pragma acc routine(S::MemFunc) gang(dim: 1)
|
|
// CHECK: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'MemFunc' 'void ()'
|
|
// CHECK-NEXT: NestedNameSpecifier{{.*}} 'S'
|
|
// CHECK-NEXT: gang clause
|
|
// CHECK-NEXT: ConstantExpr{{.*}}'int'
|
|
// CHECK-NEXT: value: Int 1
|
|
#pragma acc routine(S::StaticMemFunc) gang(dim:getInt())
|
|
// CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'StaticMemFunc' 'void ()'
|
|
// CHECK-NEXT: NestedNameSpecifier{{.*}} 'S'
|
|
// CHECK-NEXT: gang clause
|
|
// CHECK-NEXT: ConstantExpr{{.*}}'int'
|
|
// CHECK-NEXT: value: Int 1
|
|
#pragma acc routine(S::Lambda) worker
|
|
// CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'Lambda' 'const S::(lambda at
|
|
// CHECK-NEXT: NestedNameSpecifier{{.*}} 'S'
|
|
// CHECK-NEXT: worker clause
|
|
|
|
#pragma acc routine(MemFunc) gang(dim: 1)
|
|
// CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'MemFunc' 'void ()'
|
|
// CHECK-NEXT: gang clause
|
|
// CHECK-NEXT: ConstantExpr{{.*}}'int'
|
|
// CHECK-NEXT: value: Int 1
|
|
#pragma acc routine(StaticMemFunc) gang(dim:Lambda())
|
|
// CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'StaticMemFunc' 'void ()'
|
|
// CHECK-NEXT: gang clause
|
|
// CHECK-NEXT: ConstantExpr{{.*}}'int'
|
|
// CHECK-NEXT: value: Int 1
|
|
#pragma acc routine(Lambda) worker
|
|
// CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'Lambda' 'const S::(lambda at
|
|
// CHECK-NEXT: worker clause
|
|
#pragma acc routine(Lambda) worker device_type(host)
|
|
// CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'Lambda' 'const S::(lambda at
|
|
// CHECK-NEXT: worker clause
|
|
// CHECK-NEXT: device_type(host)
|
|
#pragma acc routine(Lambda) dtype(radeon) vector
|
|
// CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'Lambda' 'const S::(lambda at
|
|
// CHECK-NEXT: dtype(radeon)
|
|
// CHECK-NEXT: vector clause
|
|
};
|
|
|
|
#pragma acc routine(S::MemFunc) gang(dim: 1)
|
|
// CHECK: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'MemFunc' 'void ()'
|
|
// CHECK-NEXT: NestedNameSpecifier{{.*}} 'S'
|
|
// CHECK-NEXT: gang clause
|
|
// CHECK-NEXT: ConstantExpr{{.*}}'int'
|
|
// CHECK-NEXT: value: Int 1
|
|
#pragma acc routine(S::StaticMemFunc) worker
|
|
// CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'StaticMemFunc' 'void ()'
|
|
// CHECK-NEXT: NestedNameSpecifier{{.*}} 'S'
|
|
// CHECK-NEXT: worker clause
|
|
#pragma acc routine(S::Lambda) vector
|
|
// CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'Lambda' 'const S::(lambda at
|
|
// CHECK-NEXT: NestedNameSpecifier{{.*}} 'S'
|
|
// CHECK-NEXT: vector
|
|
|
|
template<typename T>
|
|
struct DepS {
|
|
T MemFunc();
|
|
static T StaticMemFunc();
|
|
#pragma acc routine gang(dim: T{1})
|
|
static T StaticMemFunc2();
|
|
// CHECK: CXXMethodDecl{{.*}}StaticMemFunc2
|
|
// CHECK-NEXT: OpenACCRoutineDeclAttr{{.*}}
|
|
// CHECK-NEXT: gang clause
|
|
// CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}}'T' list
|
|
constexpr static auto Lambda = [](){return 1;};
|
|
#pragma acc routine gang(dim: T{1})
|
|
constexpr static auto Lambda2 = [](){return 1;};
|
|
// CHECK: VarDecl{{.*}}Lambda2 'const auto'
|
|
// CHECK-NEXT: LambdaExpr
|
|
// CHECK-NEXT: CXXRecordDecl
|
|
// CHECK: CXXMethodDecl{{.*}} operator()
|
|
// CHECK-NEXT: CompoundStmt
|
|
// CHECK-NEXT: ReturnStmt
|
|
// CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1
|
|
// CHECK-NEXT: OpenACCRoutineDeclAttr{{.*}}
|
|
// CHECK-NEXT: gang clause
|
|
// CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}}'T' list
|
|
#pragma acc routine gang(dim: T{1})
|
|
constexpr static auto Lambda3 = [](auto){return 1;};
|
|
// CHECK: VarDecl{{.*}}Lambda3 'const auto'
|
|
// CHECK-NEXT: LambdaExpr
|
|
// CHECK-NEXT: CXXRecordDecl
|
|
// CHECK: FunctionTemplateDecl{{.*}} operator()
|
|
// CHECK-NEXT: TemplateTypeParmDecl
|
|
// CHECK-NEXT: CXXMethodDecl{{.*}} operator() 'auto (auto) const'
|
|
// CHECK-NEXT: ParmVarDecl{{.*}}'auto'
|
|
// CHECK-NEXT: CompoundStmt
|
|
// CHECK-NEXT: ReturnStmt
|
|
// CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1
|
|
// CHECK-NEXT: OpenACCRoutineDeclAttr{{.*}}
|
|
// CHECK-NEXT: gang clause
|
|
// CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}}'T' list
|
|
#pragma acc routine gang(dim: Lambda())
|
|
T MemFunc2();
|
|
// CHECK: CXXMethodDecl{{.*}}MemFunc2
|
|
// CHECK-NEXT: OpenACCRoutineDeclAttr{{.*}}
|
|
// CHECK-NEXT: gang clause
|
|
// CHECK-NEXT: CallExpr{{.*}}'<dependent type>'
|
|
|
|
#pragma acc routine(Lambda) gang(dim: Lambda())
|
|
// CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'Lambda' 'const auto'
|
|
// CHECK-NEXT: gang clause
|
|
// CHECK-NEXT: CallExpr{{.*}}'<dependent type>'
|
|
#pragma acc routine(MemFunc) worker
|
|
// CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'MemFunc' 'T ()'
|
|
// CHECK-NEXT: worker clause
|
|
#pragma acc routine(StaticMemFunc) seq
|
|
// CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'StaticMemFunc' 'T ()'
|
|
// CHECK-NEXT: seq clause
|
|
|
|
#pragma acc routine(DepS::Lambda) gang(dim:1)
|
|
// CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'Lambda' 'const auto'
|
|
// CHECK-NEXT: NestedNameSpecifier{{.*}} 'DepS<T>'
|
|
// CHECK-NEXT: gang clause
|
|
// CHECK-NEXT: ConstantExpr{{.*}}'int'
|
|
// CHECK-NEXT: value: Int 1
|
|
#pragma acc routine(DepS::MemFunc) gang
|
|
// CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'MemFunc' 'T ()'
|
|
// CHECK-NEXT: NestedNameSpecifier{{.*}} 'DepS<T>'
|
|
// CHECK-NEXT: gang clause
|
|
#pragma acc routine(DepS::StaticMemFunc) worker
|
|
// CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'StaticMemFunc' 'T ()'
|
|
// CHECK-NEXT: NestedNameSpecifier{{.*}} 'DepS<T>'
|
|
// CHECK-NEXT: worker clause
|
|
|
|
#pragma acc routine(DepS<T>::Lambda) vector
|
|
// CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'Lambda' 'const auto'
|
|
// CHECK-NEXT: NestedNameSpecifier{{.*}} 'DepS<T>'
|
|
// CHECK-NEXT: vector clause
|
|
#pragma acc routine(DepS<T>::MemFunc) seq
|
|
// CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'MemFunc' 'T ()'
|
|
// CHECK-NEXT: NestedNameSpecifier{{.*}} 'DepS<T>'
|
|
// CHECK-NEXT: seq clause
|
|
#pragma acc routine(DepS<T>::StaticMemFunc) worker
|
|
// CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'StaticMemFunc' 'T ()'
|
|
// CHECK-NEXT: NestedNameSpecifier{{.*}} 'DepS<T>'
|
|
// CHECK-NEXT: worker clause
|
|
#pragma acc routine(DepS<T>::StaticMemFunc) worker device_type(multicore)
|
|
// CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'StaticMemFunc' 'T ()'
|
|
// CHECK-NEXT: NestedNameSpecifier{{.*}} 'DepS<T>'
|
|
// CHECK-NEXT: worker clause
|
|
// CHECK-NEXT: device_type(multicore)
|
|
|
|
// Instantiation:
|
|
// CHECK: ClassTemplateSpecializationDecl{{.*}}struct DepS
|
|
// CHECK: CXXRecordDecl{{.*}} struct DepS
|
|
|
|
// CHECK: CXXMethodDecl{{.*}}StaticMemFunc2
|
|
// CHECK-NEXT: OpenACCRoutineDeclAttr{{.*}}
|
|
// CHECK-NEXT: gang clause
|
|
// CHECK-NEXT: ConstantExpr{{.*}}'int'
|
|
// CHECK-NEXT: value: Int 1
|
|
|
|
// CHECK: VarDecl{{.*}}Lambda2 'const DepS<int>::(lambda at
|
|
// CHECK-NEXT: value: Struct
|
|
// CHECK-NEXT: ImplicitCastExpr
|
|
// CHECK-NEXT: LambdaExpr
|
|
// CHECK-NEXT: CXXRecordDecl
|
|
// CHECK: CXXMethodDecl{{.*}} operator()
|
|
// CHECK-NEXT: CompoundStmt
|
|
// CHECK-NEXT: ReturnStmt
|
|
// CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1
|
|
// CHECK-NEXT: OpenACCRoutineDeclAttr{{.*}}
|
|
// CHECK-NEXT: gang clause
|
|
// CHECK-NEXT: ConstantExpr{{.*}}'int'
|
|
// CHECK-NEXT: value: Int 1
|
|
|
|
// CHECK: VarDecl{{.*}}Lambda3 'const DepS<int>::(lambda at
|
|
// CHECK-NEXT: value: Struct
|
|
// CHECK-NEXT: ImplicitCastExpr
|
|
// CHECK-NEXT: LambdaExpr
|
|
// CHECK-NEXT: CXXRecordDecl
|
|
// CHECK: FunctionTemplateDecl{{.*}} operator()
|
|
// CHECK-NEXT: TemplateTypeParmDecl
|
|
// CHECK-NEXT: CXXMethodDecl{{.*}} operator() 'auto (auto) const'
|
|
// CHECK-NEXT: ParmVarDecl{{.*}}'auto'
|
|
// CHECK-NEXT: CompoundStmt
|
|
// CHECK-NEXT: ReturnStmt
|
|
// CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1
|
|
// CHECK-NEXT: OpenACCRoutineDeclAttr{{.*}}
|
|
// CHECK-NEXT: gang clause
|
|
// CHECK-NEXT: ConstantExpr{{.*}}'int'
|
|
// CHECK-NEXT: value: Int 1
|
|
|
|
// CHECK: CXXMethodDecl{{.*}}MemFunc2
|
|
// CHECK-NEXT: OpenACCRoutineDeclAttr{{.*}}
|
|
// CHECK-NEXT: gang clause
|
|
// CHECK-NEXT: ConstantExpr{{.*}}'int'
|
|
// CHECK-NEXT: value: Int 1
|
|
|
|
// CHECK: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'Lambda' 'const DepS<int>::
|
|
// CHECK-NEXT: gang clause
|
|
// CHECK-NEXT: ConstantExpr{{.*}}'int'
|
|
// CHECK-NEXT: value: Int 1
|
|
|
|
// CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'MemFunc' 'int ()'
|
|
// CHECK-NEXT: worker clause
|
|
|
|
// CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'StaticMemFunc' 'int ()'
|
|
// CHECK-NEXT: seq clause
|
|
|
|
// CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'Lambda' 'const DepS<int>::
|
|
// CHECK-NEXT: NestedNameSpecifier{{.*}} 'DepS<int>'
|
|
// CHECK-NEXT: gang clause
|
|
// CHECK-NEXT: ConstantExpr{{.*}}'int'
|
|
// CHECK-NEXT: value: Int 1
|
|
|
|
// CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'MemFunc' 'int ()'
|
|
// CHECK-NEXT: NestedNameSpecifier{{.*}} 'DepS<int>'
|
|
// CHECK-NEXT: gang clause
|
|
|
|
// CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'StaticMemFunc' 'int ()'
|
|
// CHECK-NEXT: NestedNameSpecifier{{.*}} 'DepS<int>'
|
|
// CHECK-NEXT: worker clause
|
|
|
|
// CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'Lambda' 'const DepS<int>::
|
|
// CHECK-NEXT: NestedNameSpecifier{{.*}} 'DepS<int>'
|
|
// CHECK-NEXT: vector clause
|
|
|
|
// CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'MemFunc' 'int ()'
|
|
// CHECK-NEXT: NestedNameSpecifier{{.*}} 'DepS<int>'
|
|
// CHECK-NEXT: seq clause
|
|
|
|
// CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'StaticMemFunc' 'int ()'
|
|
// CHECK-NEXT: NestedNameSpecifier{{.*}} 'DepS<int>'
|
|
// CHECK-NEXT: worker clause
|
|
|
|
// CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'StaticMemFunc' 'int ()'
|
|
// CHECK-NEXT: NestedNameSpecifier{{.*}} 'DepS<int>'
|
|
// CHECK-NEXT: worker clause
|
|
// CHECK-NEXT: device_type(multicore)
|
|
};
|
|
|
|
#pragma acc routine(DepS<int>::Lambda) gang(dim:1)
|
|
// CHECK: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'Lambda' 'const DepS<int>::
|
|
// CHECK-NEXT: NestedNameSpecifier{{.*}} 'DepS<int>'
|
|
// CHECK-NEXT: gang clause
|
|
// CHECK-NEXT: ConstantExpr{{.*}}'int'
|
|
// CHECK-NEXT: value: Int 1
|
|
#pragma acc routine(DepS<int>::MemFunc) worker
|
|
// CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'MemFunc' 'int ()'
|
|
// CHECK-NEXT: NestedNameSpecifier{{.*}} 'DepS<int>'
|
|
// CHECK-NEXT: worker clause
|
|
#pragma acc routine(DepS<int>::StaticMemFunc) vector
|
|
// CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'StaticMemFunc' 'int ()'
|
|
// CHECK-NEXT: NestedNameSpecifier{{.*}} 'DepS<int>'
|
|
// CHECK-NEXT: vector clause
|
|
|
|
template<typename T>
|
|
void TemplFunc() {
|
|
#pragma acc routine(T::MemFunc) gang(dim:T::Lambda())
|
|
// CHECK: DeclStmt
|
|
// CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DependentScopeDeclRefExpr{{.*}}'<dependent type>'
|
|
// CHECK-NEXT: NestedNameSpecifier{{.*}} 'T'
|
|
// CHECK-NEXT: gang clause
|
|
// CHECK-NEXT: CallExpr{{.*}}'<dependent type>'
|
|
#pragma acc routine(T::StaticMemFunc) nohost worker bind("string")
|
|
// CHECK-NEXT: DeclStmt
|
|
// CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DependentScopeDeclRefExpr{{.*}}'<dependent type>'
|
|
// CHECK-NEXT: NestedNameSpecifier{{.*}} 'T'
|
|
// CHECK-NEXT: nohost clause
|
|
// CHECK-NEXT: worker clause
|
|
// CHECK-NEXT: bind clause
|
|
// CHECK-NEXT: StringLiteral{{.*}} "string"
|
|
#pragma acc routine(T::Lambda) seq nohost bind(identifier)
|
|
// CHECK-NEXT: DeclStmt
|
|
// CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DependentScopeDeclRefExpr{{.*}}'<dependent type>'
|
|
// CHECK-NEXT: NestedNameSpecifier{{.*}} 'T'
|
|
// CHECK-NEXT: seq clause
|
|
// CHECK-NEXT: nohost clause
|
|
// CHECK-NEXT: bind clause identifier 'identifier'
|
|
|
|
auto Lambda1 = [](){};
|
|
#pragma acc routine(Lambda1) seq
|
|
// CHECK: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'Lambda1' 'auto'
|
|
// CHECK-NEXT: seq clause
|
|
|
|
#pragma acc routine seq
|
|
auto Lambda2 = [](){};
|
|
// CHECK: VarDecl{{.*}} Lambda2 'auto'
|
|
// CHECK-NEXT: LambdaExpr
|
|
// CHECK-NEXT: CXXRecordDecl
|
|
// CHECK: CXXMethodDecl{{.*}} operator()
|
|
// CHECK-NEXT: CompoundStmt
|
|
// CHECK-NEXT: OpenACCRoutineDeclAttr{{.*}}
|
|
// CHECK-NEXT: seq clause
|
|
|
|
#pragma acc routine seq
|
|
auto Lambda3 = [](auto){};
|
|
// CHECK: VarDecl{{.*}} Lambda3 'auto'
|
|
// CHECK-NEXT: LambdaExpr
|
|
// CHECK-NEXT: CXXRecordDecl
|
|
// CHECK: FunctionTemplateDecl{{.*}} operator()
|
|
// CHECK-NEXT: TemplateTypeParmDecl
|
|
// CHECK-NEXT: CXXMethodDecl{{.*}} operator() 'auto (auto) const'
|
|
// CHECK-NEXT: ParmVarDecl{{.*}}'auto'
|
|
// CHECK-NEXT: CompoundStmt
|
|
// CHECK-NEXT: OpenACCRoutineDeclAttr
|
|
// CHECK-NEXT: seq clause
|
|
|
|
Lambda3(T{});
|
|
|
|
// Instantiation:
|
|
// CHECK: FunctionDecl{{.*}} TemplFunc 'void ()' implicit_instantiation
|
|
// CHECK: DeclStmt
|
|
// CHECK-NEXT: OpenACCRoutineDecl{{.*}}
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'MemFunc' 'void ()'
|
|
// CHECK-NEXT: NestedNameSpecifier{{.*}} 'S'
|
|
// CHECK-NEXT: gang clause
|
|
// CHECK-NEXT: ConstantExpr{{.*}}'int'
|
|
// CHECK-NEXT: value: Int 1
|
|
|
|
// CHECK-NEXT: DeclStmt
|
|
// CHECK-NEXT: OpenACCRoutineDecl{{.*}}
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'StaticMemFunc' 'void ()'
|
|
// CHECK-NEXT: NestedNameSpecifier{{.*}} 'S'
|
|
// CHECK-NEXT: nohost clause
|
|
// CHECK-NEXT: worker clause
|
|
// CHECK-NEXT: bind clause
|
|
// CHECK-NEXT: StringLiteral{{.*}} "string"
|
|
|
|
// CHECK-NEXT: DeclStmt
|
|
// CHECK-NEXT: OpenACCRoutineDecl{{.*}}
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'Lambda' 'const S::(lambda at
|
|
// CHECK-NEXT: NestedNameSpecifier{{.*}} 'S'
|
|
// CHECK-NEXT: seq clause
|
|
// CHECK-NEXT: nohost clause
|
|
// CHECK-NEXT: bind clause identifier 'identifier'
|
|
|
|
// CHECK: OpenACCRoutineDecl{{.*}} routine
|
|
// CHECK-NEXT: DeclRefExpr{{.*}} 'Lambda1' '(lambda at
|
|
// CHECK-NEXT: seq clause
|
|
|
|
// CHECK: VarDecl{{.*}} Lambda2 '(lambda at
|
|
// CHECK-NEXT: LambdaExpr
|
|
// CHECK-NEXT: CXXRecordDecl
|
|
// CHECK: CXXMethodDecl{{.*}} operator()
|
|
// CHECK-NEXT: CompoundStmt
|
|
// CHECK-NEXT: OpenACCRoutineDeclAttr{{.*}}
|
|
// CHECK-NEXT: seq clause
|
|
|
|
// CHECK: VarDecl{{.*}} Lambda3 '(lambda at
|
|
// CHECK-NEXT: LambdaExpr
|
|
// CHECK-NEXT: CXXRecordDecl
|
|
// CHECK: FunctionTemplateDecl{{.*}} operator()
|
|
// CHECK-NEXT: TemplateTypeParmDecl
|
|
// CHECK-NEXT: CXXMethodDecl{{.*}} operator() 'auto (auto) const'
|
|
// CHECK-NEXT: ParmVarDecl{{.*}}'auto'
|
|
// CHECK-NEXT: CompoundStmt
|
|
// CHECK-NEXT: OpenACCRoutineDeclAttr
|
|
// CHECK-NEXT: seq clause
|
|
// CHECK: CXXMethodDecl{{.*}} operator() 'void (S) const'
|
|
// CHECK-NEXT: TemplateArgument
|
|
// CHECK-NEXT: RecordType
|
|
// CHECK-NEXT: CXXRecord
|
|
// CHECK-NEXT: ParmVarDecl
|
|
// CHECK-NEXT: CompoundStmt
|
|
// CHECK-NEXT: OpenACCRoutineDeclAttr
|
|
// CHECK-NEXT: seq clause
|
|
}
|
|
|
|
void usage() {
|
|
DepS<int> s;
|
|
TemplFunc<S>();
|
|
}
|
|
|
|
#endif
|