0
0
mirror of https://github.com/llvm/llvm-project.git synced 2025-04-27 13:16:08 +00:00
llvm-project/clang/test/AST/ast-print-openacc-routine-construct.cpp
erichkeane d47401e376 [OpenACC] Start enforcing 'device_type' clause values
Researching in prep of doing the implementation for lowering, I found
that the source of the valid identifiers list from flang is in the
frontend.  This patch adds the same list to the frontend, but does it as
a sema diagnostic, so we still parse it as an identifier/identifier-like
thing, but then diagnose it as invalid later.
2025-04-09 14:55:50 -07:00

173 lines
6.3 KiB
C++

// 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<typename T>
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<T>::Lambda) gang(dim: 1)
#pragma acc routine(DepS::MemFunc) gang
// CHECK-NEXT: #pragma acc routine(DepS<T>::MemFunc) gang
#pragma acc routine(DepS::StaticMemFunc) worker
// CHECK-NEXT: #pragma acc routine(DepS<T>::StaticMemFunc) worker
#pragma acc routine(DepS<T>::Lambda) vector
// CHECK-NEXT: #pragma acc routine(DepS<T>::Lambda) vector
#pragma acc routine(DepS<T>::MemFunc) seq nohost
// CHECK-NEXT: #pragma acc routine(DepS<T>::MemFunc) seq nohost
#pragma acc routine(DepS<T>::StaticMemFunc) nohost worker
// CHECK-NEXT: #pragma acc routine(DepS<T>::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<int>::Lambda) gang bind("string")
#pragma acc routine(DepS<int>::Lambda) gang bind("string")
// CHECK: #pragma acc routine(DepS<int>::MemFunc) gang(dim: 1)
#pragma acc routine(DepS<int>::MemFunc) gang(dim:1)
// CHECK: #pragma acc routine(DepS<int>::StaticMemFunc) vector bind(identifier)
#pragma acc routine(DepS<int>::StaticMemFunc) vector bind(identifier)
template<typename T>
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{});
}