// 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 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{{.*}}'' #pragma acc routine(Lambda) gang(dim: Lambda()) // CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine // CHECK-NEXT: DeclRefExpr{{.*}} 'Lambda' 'const auto' // CHECK-NEXT: gang clause // CHECK-NEXT: CallExpr{{.*}}'' #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' // 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' // CHECK-NEXT: gang clause #pragma acc routine(DepS::StaticMemFunc) worker // CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine // CHECK-NEXT: DeclRefExpr{{.*}} 'StaticMemFunc' 'T ()' // CHECK-NEXT: NestedNameSpecifier{{.*}} 'DepS' // CHECK-NEXT: worker clause #pragma acc routine(DepS::Lambda) vector // CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine // CHECK-NEXT: DeclRefExpr{{.*}} 'Lambda' 'const auto' // CHECK-NEXT: NestedNameSpecifier{{.*}} 'DepS' // CHECK-NEXT: vector clause #pragma acc routine(DepS::MemFunc) seq // CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine // CHECK-NEXT: DeclRefExpr{{.*}} 'MemFunc' 'T ()' // CHECK-NEXT: NestedNameSpecifier{{.*}} 'DepS' // CHECK-NEXT: seq clause #pragma acc routine(DepS::StaticMemFunc) worker // CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine // CHECK-NEXT: DeclRefExpr{{.*}} 'StaticMemFunc' 'T ()' // CHECK-NEXT: NestedNameSpecifier{{.*}} 'DepS' // CHECK-NEXT: worker clause #pragma acc routine(DepS::StaticMemFunc) worker device_type(multicore) // CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine // CHECK-NEXT: DeclRefExpr{{.*}} 'StaticMemFunc' 'T ()' // CHECK-NEXT: NestedNameSpecifier{{.*}} 'DepS' // 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::(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::(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:: // 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:: // CHECK-NEXT: NestedNameSpecifier{{.*}} 'DepS' // 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' // CHECK-NEXT: gang clause // CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine // CHECK-NEXT: DeclRefExpr{{.*}} 'StaticMemFunc' 'int ()' // CHECK-NEXT: NestedNameSpecifier{{.*}} 'DepS' // CHECK-NEXT: worker clause // CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine // CHECK-NEXT: DeclRefExpr{{.*}} 'Lambda' 'const DepS:: // CHECK-NEXT: NestedNameSpecifier{{.*}} 'DepS' // CHECK-NEXT: vector clause // CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine // CHECK-NEXT: DeclRefExpr{{.*}} 'MemFunc' 'int ()' // CHECK-NEXT: NestedNameSpecifier{{.*}} 'DepS' // CHECK-NEXT: seq clause // CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine // CHECK-NEXT: DeclRefExpr{{.*}} 'StaticMemFunc' 'int ()' // CHECK-NEXT: NestedNameSpecifier{{.*}} 'DepS' // CHECK-NEXT: worker clause // CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine // CHECK-NEXT: DeclRefExpr{{.*}} 'StaticMemFunc' 'int ()' // CHECK-NEXT: NestedNameSpecifier{{.*}} 'DepS' // CHECK-NEXT: worker clause // CHECK-NEXT: device_type(multicore) }; #pragma acc routine(DepS::Lambda) gang(dim:1) // CHECK: OpenACCRoutineDecl{{.*}} routine // CHECK-NEXT: DeclRefExpr{{.*}} 'Lambda' 'const DepS:: // CHECK-NEXT: NestedNameSpecifier{{.*}} 'DepS' // CHECK-NEXT: gang clause // CHECK-NEXT: ConstantExpr{{.*}}'int' // CHECK-NEXT: value: Int 1 #pragma acc routine(DepS::MemFunc) worker // CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine // CHECK-NEXT: DeclRefExpr{{.*}} 'MemFunc' 'int ()' // CHECK-NEXT: NestedNameSpecifier{{.*}} 'DepS' // CHECK-NEXT: worker clause #pragma acc routine(DepS::StaticMemFunc) vector // CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine // CHECK-NEXT: DeclRefExpr{{.*}} 'StaticMemFunc' 'int ()' // CHECK-NEXT: NestedNameSpecifier{{.*}} 'DepS' // CHECK-NEXT: vector clause template void TemplFunc() { #pragma acc routine(T::MemFunc) gang(dim:T::Lambda()) // CHECK: DeclStmt // CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}}'' // CHECK-NEXT: NestedNameSpecifier{{.*}} 'T' // CHECK-NEXT: gang clause // CHECK-NEXT: CallExpr{{.*}}'' #pragma acc routine(T::StaticMemFunc) nohost worker bind("string") // CHECK-NEXT: DeclStmt // CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}}'' // 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{{.*}}'' // 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 s; TemplFunc(); } #endif