Files
clang-p2996/clang/test/ParserOpenACC/parse-clauses.cpp
erichkeane df1e102e2a [OpenACC] implement AST/Sema for 'routine' construct with argument
The 'routine' construct has two forms, one which takes the name of a
function that it applies to, and another where it implicitly figures it
out based on the next declaration. This patch implements the former with
the required restrictions on the name and the function-static-variables
as specified.

What has not been implemented is any clauses for this, any of the A.3.4
warnings, or the other form.
2025-03-06 06:42:17 -08:00

101 lines
3.3 KiB
C++

// RUN: %clang_cc1 %s -verify -fopenacc
template<unsigned I, typename T>
void templ() {
#pragma acc loop collapse(I)
for(int i = 0; i < 5;++i)
for(int j = 0; j < 5; ++j)
for(int k = 0; k < 5; ++k)
for(int l = 0; l < 5; ++l)
for(int m = 0; m < 5; ++m)
for(int n = 0; n < 5; ++n)
for(int o = 0; o < 5; ++o);
#pragma acc loop collapse(T::value)
for(int i = 0;i < 5;++i)
for(int j = 0; j < 5; ++j)
for(int k = 0; k < 5; ++k)
for(int l = 0; l < 5; ++l)
for(int m = 0; m < 5;++m)
for(;;)
for(;;);
#pragma acc parallel vector_length(T::value)
for(;;){}
#pragma acc parallel vector_length(I)
for(;;){}
#pragma acc parallel async(T::value)
for(;;){}
#pragma acc parallel async(I)
for(;;){}
#pragma acc parallel async
for(;;){}
T t;
#pragma acc exit data delete(t)
;
}
struct S {
static constexpr unsigned value = 5;
};
void use() {
templ<7, S>();
}
namespace NS {
void NSFunc();
class RecordTy { // #RecTy
static constexpr bool Value = false; // #VAL
void priv_mem_function(); // #PrivMemFun
public:
static constexpr bool ValuePub = true;
void mem_function();
};
template<typename T>
class TemplTy{};
void function();
}
// expected-warning@+1{{OpenACC clause 'bind' not yet implemented, clause ignored}}
#pragma acc routine(use) bind(NS::NSFunc)
// expected-error@+2{{'RecordTy' does not refer to a value}}
// expected-note@#RecTy{{declared here}}
#pragma acc routine(use) bind(NS::RecordTy)
// expected-error@+3{{'Value' is a private member of 'NS::RecordTy'}}
// expected-note@#VAL{{implicitly declared private here}}
// expected-warning@+1{{OpenACC clause 'bind' not yet implemented, clause ignored}}
#pragma acc routine(use) bind(NS::RecordTy::Value)
// expected-warning@+1{{OpenACC clause 'bind' not yet implemented, clause ignored}}
#pragma acc routine(use) bind(NS::RecordTy::ValuePub)
// expected-warning@+1{{OpenACC clause 'bind' not yet implemented, clause ignored}}
#pragma acc routine(use) bind(NS::TemplTy<int>)
// expected-error@+1{{no member named 'unknown' in namespace 'NS'}}
#pragma acc routine(use) bind(NS::unknown<int>)
// expected-warning@+1{{OpenACC clause 'bind' not yet implemented, clause ignored}}
#pragma acc routine(use) bind(NS::function)
// expected-error@+3{{'priv_mem_function' is a private member of 'NS::RecordTy'}}
// expected-note@#PrivMemFun{{implicitly declared private here}}
// expected-warning@+1{{OpenACC clause 'bind' not yet implemented, clause ignored}}
#pragma acc routine(use) bind(NS::RecordTy::priv_mem_function)
// expected-warning@+1{{OpenACC clause 'bind' not yet implemented, clause ignored}}
#pragma acc routine(use) bind(NS::RecordTy::mem_function)
// expected-error@+1{{string literal with user-defined suffix cannot be used here}}
#pragma acc routine(use) bind("unknown udl"_UDL)
// expected-warning@+2{{encoding prefix 'u' on an unevaluated string literal has no effect}}
// expected-warning@+1{{OpenACC clause 'bind' not yet implemented, clause ignored}}
#pragma acc routine(use) bind(u"16 bits")
// expected-warning@+2{{encoding prefix 'U' on an unevaluated string literal has no effect}}
// expected-warning@+1{{OpenACC clause 'bind' not yet implemented, clause ignored}}
#pragma acc routine(use) bind(U"32 bits")