173 lines · cpp
1// RUN: %clang_cc1 -fopenacc -ast-print %s -o - | FileCheck %s2 3auto Lambda = [](){};4// CHECK: auto Lambda = []() {5#pragma acc routine(Lambda) worker bind(identifier)6// CHECK: #pragma acc routine(Lambda) worker bind(identifier)7 8int function();9#pragma acc routine (function) vector nohost bind("string")10// CHECK: #pragma acc routine(function) vector nohost bind("string")11#pragma acc routine(function) device_type(multicore) seq12// CHECK-NEXT: #pragma acc routine(function) device_type(multicore) seq13#pragma acc routine(function) dtype(radeon) seq14// CHECK-NEXT: #pragma acc routine(function) dtype(radeon) seq15 16#pragma acc routine nohost vector17int function2();18// CHECK: #pragma acc routine nohost vector19// CHECK-NEXT: int function2()20 21#pragma acc routine worker nohost bind("asdf")22auto Lambda2 = [](){};23// CHECK: #pragma acc routine worker nohost bind("asdf")24// CHECK-NEXT: auto Lambda2 = []() {25#pragma acc routine worker nohost bind("asdf")26auto Lambda3 = [](auto){};27// CHECK: #pragma acc routine worker nohost bind("asdf")28// CHECK-NEXT: auto Lambda3 = [](auto) {29 30namespace NS {31 int NSFunc();32auto Lambda = [](){};33}34 35#pragma acc routine(NS::NSFunc) seq36// CHECK: #pragma acc routine(NS::NSFunc) seq37#pragma acc routine(NS::Lambda) nohost gang38 39constexpr int getInt() { return 1; }40 41struct S {42 // CHECK: struct S {43 // despite being targetted by 'named' versions, we shouldn't print the44 // attribute here.45 // CHECK-NEXT: void MemFunc();46 void MemFunc();47#pragma acc routine gang(dim: 1)48 void MemFunc2();49// CHECK-NEXT: #pragma acc routine gang(dim: 1)50// CHECK-NEXT: void MemFunc2();51 static void StaticMemFunc();52// CHECK-NEXT: static void StaticMemFunc();53#pragma acc routine gang(dim: getInt())54 static void StaticMemFunc2();55// CHECK-NEXT: #pragma acc routine gang(dim: getInt())56// CHECK-NEXT: static void StaticMemFunc2();57 58 constexpr static auto Lambda = [](){};59// CHECK-NEXT: static constexpr auto Lambda = []() {60#pragma acc routine worker61 constexpr static auto Lambda2 = [](){ return 1; };62// CHECK: #pragma acc routine worker63// CHECK-NEXT: static constexpr auto Lambda2 = []() {64 65#pragma acc routine(S::MemFunc) gang(dim:1)66// CHECK: #pragma acc routine(S::MemFunc) gang(dim: 1)67#pragma acc routine(S::StaticMemFunc) gang(dim:getInt())68// CHECK-NEXT: #pragma acc routine(S::StaticMemFunc) gang(dim: getInt())69#pragma acc routine(S::Lambda) worker70// CHECK-NEXT: #pragma acc routine(S::Lambda) worker71 72#pragma acc routine(MemFunc) gang(dim:1)73// CHECK-NEXT: #pragma acc routine(MemFunc) gang(dim: 1)74#pragma acc routine(StaticMemFunc) gang(dim:getInt())75// CHECK-NEXT: #pragma acc routine(StaticMemFunc) gang(dim: getInt())76#pragma acc routine(Lambda) nohost worker77// CHECK-NEXT: #pragma acc routine(Lambda) nohost worker78};79 80#pragma acc routine(S::MemFunc) gang(dim:1)81// CHECK: #pragma acc routine(S::MemFunc) gang(dim: 1)82#pragma acc routine(S::StaticMemFunc) worker83// CHECK-NEXT: #pragma acc routine(S::StaticMemFunc) worker84#pragma acc routine(S::Lambda) vector85// CHECK-NEXT: #pragma acc routine(S::Lambda) vector86 87template<typename T>88struct DepS {89 void MemFunc();90// CHECK: void MemFunc();91 92 static void StaticMemFunc();93// CHECK-NEXT: static void StaticMemFunc();94 95#pragma acc routine gang(dim: T{1})96 static T StaticMemFunc2();97// CHECK-NEXT: #pragma acc routine gang(dim: T{1})98// CHECK-NEXT: static T StaticMemFunc2();99 100 constexpr static auto Lambda = [](){ return 1;};101// CHECK-NEXT: static constexpr auto Lambda = []() {102 103#pragma acc routine gang(dim: T{1})104 constexpr static auto Lambda2 = [](){return 1;};105// CHECK: #pragma acc routine gang(dim: T{1})106// CHECK-NEXT: static constexpr auto Lambda2 = []() {107#pragma acc routine gang(dim: T{1})108 constexpr static auto Lambda3 = [](auto){return 1;};109// CHECK: #pragma acc routine gang(dim: T{1})110// CHECK-NEXT: static constexpr auto Lambda3 = [](auto) {111#pragma acc routine gang(dim: Lambda())112 T MemFunc2();113// CHECK: #pragma acc routine gang(dim: Lambda())114// CHECK-NEXT: T MemFunc2();115 116#pragma acc routine(Lambda) gang(dim:Lambda())117// CHECK-NEXT: #pragma acc routine(Lambda) gang(dim: Lambda())118#pragma acc routine(MemFunc) worker119// CHECK-NEXT: #pragma acc routine(MemFunc) worker120#pragma acc routine(StaticMemFunc) seq121// CHECK-NEXT: #pragma acc routine(StaticMemFunc) seq122 123#pragma acc routine(DepS::Lambda) gang(dim:1)124// CHECK-NEXT: #pragma acc routine(DepS<T>::Lambda) gang(dim: 1)125#pragma acc routine(DepS::MemFunc) gang126// CHECK-NEXT: #pragma acc routine(DepS<T>::MemFunc) gang127#pragma acc routine(DepS::StaticMemFunc) worker128// CHECK-NEXT: #pragma acc routine(DepS<T>::StaticMemFunc) worker129 130#pragma acc routine(DepS<T>::Lambda) vector131// CHECK-NEXT: #pragma acc routine(DepS<T>::Lambda) vector132#pragma acc routine(DepS<T>::MemFunc) seq nohost133// CHECK-NEXT: #pragma acc routine(DepS<T>::MemFunc) seq nohost134#pragma acc routine(DepS<T>::StaticMemFunc) nohost worker135// CHECK-NEXT: #pragma acc routine(DepS<T>::StaticMemFunc) nohost worker136 137#pragma acc routine (MemFunc) worker dtype(*)138// CHECK-NEXT: #pragma acc routine(MemFunc) worker dtype(*)139#pragma acc routine (MemFunc) device_type(nvidia) vector140// CHECK-NEXT: #pragma acc routine(MemFunc) device_type(nvidia) vector141};142 143// CHECK: #pragma acc routine(DepS<int>::Lambda) gang bind("string")144#pragma acc routine(DepS<int>::Lambda) gang bind("string")145// CHECK: #pragma acc routine(DepS<int>::MemFunc) gang(dim: 1)146#pragma acc routine(DepS<int>::MemFunc) gang(dim:1)147// CHECK: #pragma acc routine(DepS<int>::StaticMemFunc) vector bind(identifier)148#pragma acc routine(DepS<int>::StaticMemFunc) vector bind(identifier)149 150 151template<typename T>152void TemplFunc() {153// CHECK: #pragma acc routine(T::MemFunc) gang(dim: T::SomethingElse())154#pragma acc routine(T::MemFunc) gang(dim:T::SomethingElse())155// CHECK: #pragma acc routine(T::StaticMemFunc) worker nohost bind(identifier)156#pragma acc routine(T::StaticMemFunc) worker nohost bind(identifier)157// CHECK: #pragma acc routine(T::Lambda) nohost seq bind("string")158#pragma acc routine(T::Lambda) nohost seq bind("string")159 160 auto Lambda1 = [](){};161#pragma acc routine(Lambda1) seq162// CHECK: #pragma acc routine(Lambda1) seq163#pragma acc routine seq164 auto Lambda2 = [](){};165// CHECK: #pragma acc routine seq166// CHECK-NEXT: auto Lambda2 = []() {167#pragma acc routine seq168 auto Lambda3 = [](auto){};169// CHECK: #pragma acc routine seq170// CHECK-NEXT: auto Lambda3 = [](auto) {171 Lambda3(T{});172}173