// RUN: %clang_cc1 -fopenacc -ast-print %s -o - | FileCheck %s auto Lambda = [](){}; // CHECK: auto Lambda = []() { #pragma acc routine(Lambda) worker bind(identifier) // CHECK: #pragma acc routine(Lambda) worker bind(identifier) int function(); #pragma acc routine (function) vector nohost bind("string") // CHECK: #pragma acc routine(function) vector nohost bind("string") #pragma acc routine(function) device_type(multicore) seq // CHECK-NEXT: #pragma acc routine(function) device_type(multicore) seq #pragma acc routine(function) dtype(radeon) seq // CHECK-NEXT: #pragma acc routine(function) dtype(radeon) seq #pragma acc routine nohost vector int function2(); // CHECK: #pragma acc routine nohost vector // CHECK-NEXT: int function2() #pragma acc routine worker nohost bind("asdf") auto Lambda2 = [](){}; // CHECK: #pragma acc routine worker nohost bind("asdf") // CHECK-NEXT: auto Lambda2 = []() { #pragma acc routine worker nohost bind("asdf") auto Lambda3 = [](auto){}; // CHECK: #pragma acc routine worker nohost bind("asdf") // CHECK-NEXT: auto Lambda3 = [](auto) { namespace NS { int NSFunc(); auto Lambda = [](){}; } #pragma acc routine(NS::NSFunc) seq // CHECK: #pragma acc routine(NS::NSFunc) seq #pragma acc routine(NS::Lambda) nohost gang constexpr int getInt() { return 1; } struct S { // CHECK: struct S { // despite being targetted by 'named' versions, we shouldn't print the // attribute here. // CHECK-NEXT: void MemFunc(); void MemFunc(); #pragma acc routine gang(dim: 1) void MemFunc2(); // CHECK-NEXT: #pragma acc routine gang(dim: 1) // CHECK-NEXT: void MemFunc2(); static void StaticMemFunc(); // CHECK-NEXT: static void StaticMemFunc(); #pragma acc routine gang(dim: getInt()) static void StaticMemFunc2(); // CHECK-NEXT: #pragma acc routine gang(dim: getInt()) // CHECK-NEXT: static void StaticMemFunc2(); constexpr static auto Lambda = [](){}; // CHECK-NEXT: static constexpr auto Lambda = []() { #pragma acc routine worker constexpr static auto Lambda2 = [](){ return 1; }; // CHECK: #pragma acc routine worker // CHECK-NEXT: static constexpr auto Lambda2 = []() { #pragma acc routine(S::MemFunc) gang(dim:1) // CHECK: #pragma acc routine(S::MemFunc) gang(dim: 1) #pragma acc routine(S::StaticMemFunc) gang(dim:getInt()) // CHECK-NEXT: #pragma acc routine(S::StaticMemFunc) gang(dim: getInt()) #pragma acc routine(S::Lambda) worker // CHECK-NEXT: #pragma acc routine(S::Lambda) worker #pragma acc routine(MemFunc) gang(dim:1) // CHECK-NEXT: #pragma acc routine(MemFunc) gang(dim: 1) #pragma acc routine(StaticMemFunc) gang(dim:getInt()) // CHECK-NEXT: #pragma acc routine(StaticMemFunc) gang(dim: getInt()) #pragma acc routine(Lambda) nohost worker // CHECK-NEXT: #pragma acc routine(Lambda) nohost worker }; #pragma acc routine(S::MemFunc) gang(dim:1) // CHECK: #pragma acc routine(S::MemFunc) gang(dim: 1) #pragma acc routine(S::StaticMemFunc) worker // CHECK-NEXT: #pragma acc routine(S::StaticMemFunc) worker #pragma acc routine(S::Lambda) vector // CHECK-NEXT: #pragma acc routine(S::Lambda) vector template struct DepS { void MemFunc(); // CHECK: void MemFunc(); static void StaticMemFunc(); // CHECK-NEXT: static void StaticMemFunc(); #pragma acc routine gang(dim: T{1}) static T StaticMemFunc2(); // CHECK-NEXT: #pragma acc routine gang(dim: T{1}) // CHECK-NEXT: static T StaticMemFunc2(); constexpr static auto Lambda = [](){ return 1;}; // CHECK-NEXT: static constexpr auto Lambda = []() { #pragma acc routine gang(dim: T{1}) constexpr static auto Lambda2 = [](){return 1;}; // CHECK: #pragma acc routine gang(dim: T{1}) // CHECK-NEXT: static constexpr auto Lambda2 = []() { #pragma acc routine gang(dim: T{1}) constexpr static auto Lambda3 = [](auto){return 1;}; // CHECK: #pragma acc routine gang(dim: T{1}) // CHECK-NEXT: static constexpr auto Lambda3 = [](auto) { #pragma acc routine gang(dim: Lambda()) T MemFunc2(); // CHECK: #pragma acc routine gang(dim: Lambda()) // CHECK-NEXT: T MemFunc2(); #pragma acc routine(Lambda) gang(dim:Lambda()) // CHECK-NEXT: #pragma acc routine(Lambda) gang(dim: Lambda()) #pragma acc routine(MemFunc) worker // CHECK-NEXT: #pragma acc routine(MemFunc) worker #pragma acc routine(StaticMemFunc) seq // CHECK-NEXT: #pragma acc routine(StaticMemFunc) seq #pragma acc routine(DepS::Lambda) gang(dim:1) // CHECK-NEXT: #pragma acc routine(DepS::Lambda) gang(dim: 1) #pragma acc routine(DepS::MemFunc) gang // CHECK-NEXT: #pragma acc routine(DepS::MemFunc) gang #pragma acc routine(DepS::StaticMemFunc) worker // CHECK-NEXT: #pragma acc routine(DepS::StaticMemFunc) worker #pragma acc routine(DepS::Lambda) vector // CHECK-NEXT: #pragma acc routine(DepS::Lambda) vector #pragma acc routine(DepS::MemFunc) seq nohost // CHECK-NEXT: #pragma acc routine(DepS::MemFunc) seq nohost #pragma acc routine(DepS::StaticMemFunc) nohost worker // CHECK-NEXT: #pragma acc routine(DepS::StaticMemFunc) nohost worker #pragma acc routine (MemFunc) worker dtype(*) // CHECK-NEXT: #pragma acc routine(MemFunc) worker dtype(*) #pragma acc routine (MemFunc) device_type(nvidia) vector // CHECK-NEXT: #pragma acc routine(MemFunc) device_type(nvidia) vector }; // CHECK: #pragma acc routine(DepS::Lambda) gang bind("string") #pragma acc routine(DepS::Lambda) gang bind("string") // CHECK: #pragma acc routine(DepS::MemFunc) gang(dim: 1) #pragma acc routine(DepS::MemFunc) gang(dim:1) // CHECK: #pragma acc routine(DepS::StaticMemFunc) vector bind(identifier) #pragma acc routine(DepS::StaticMemFunc) vector bind(identifier) template void TemplFunc() { // CHECK: #pragma acc routine(T::MemFunc) gang(dim: T::SomethingElse()) #pragma acc routine(T::MemFunc) gang(dim:T::SomethingElse()) // CHECK: #pragma acc routine(T::StaticMemFunc) worker nohost bind(identifier) #pragma acc routine(T::StaticMemFunc) worker nohost bind(identifier) // CHECK: #pragma acc routine(T::Lambda) nohost seq bind("string") #pragma acc routine(T::Lambda) nohost seq bind("string") auto Lambda1 = [](){}; #pragma acc routine(Lambda1) seq // CHECK: #pragma acc routine(Lambda1) seq #pragma acc routine seq auto Lambda2 = [](){}; // CHECK: #pragma acc routine seq // CHECK-NEXT: auto Lambda2 = []() { #pragma acc routine seq auto Lambda3 = [](auto){}; // CHECK: #pragma acc routine seq // CHECK-NEXT: auto Lambda3 = [](auto) { Lambda3(T{}); }