Files
clang-p2996/clang/test/ParserOpenACC/parse-clauses.cpp
Erich Keane 26fee0ff12 [OpenACC] Implement Sema work for OpenACC Clauses (#87821)
Now that we have AST nodes for OpenACC Clauses, this patch adds their
creation to Sema and makes the Parser call all the required functions.
This also redoes TreeTransform to work with the clauses/make sure they
are transformed.

Much of this is NFC, since there is no clause we can test this behavior
with. However, there IS one noticable change; we are now no longer
diagnosing that a clause is 'not implemented' unless it there was no
errors parsing its parameters. This is because it cleans up how we
create and diagnose clauses.
2024-04-08 09:05:09 -07:00

101 lines
4.6 KiB
C++

// RUN: %clang_cc1 %s -verify -fopenacc
template<unsigned I, typename T>
void templ() {
// expected-warning@+2{{OpenACC clause 'collapse' not yet implemented, clause ignored}}
// expected-warning@+1{{OpenACC construct 'loop' not yet implemented, pragma ignored}}
#pragma acc loop collapse(I)
for(;;){}
// expected-warning@+2{{OpenACC clause 'collapse' not yet implemented, clause ignored}}
// expected-warning@+1{{OpenACC construct 'loop' not yet implemented, pragma ignored}}
#pragma acc loop collapse(T::value)
for(;;){}
// expected-warning@+1{{OpenACC clause 'vector_length' not yet implemented, clause ignored}}
#pragma acc parallel vector_length(T::value)
for(;;){}
// expected-warning@+1{{OpenACC clause 'vector_length' not yet implemented, clause ignored}}
#pragma acc parallel vector_length(I)
for(;;){}
// expected-warning@+1{{OpenACC clause 'async' not yet implemented, clause ignored}}
#pragma acc parallel async(T::value)
for(;;){}
// expected-warning@+1{{OpenACC clause 'async' not yet implemented, clause ignored}}
#pragma acc parallel async(I)
for(;;){}
}
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@+2{{OpenACC clause 'bind' not yet implemented, clause ignored}}
// expected-warning@+1{{OpenACC construct 'routine' not yet implemented, pragma ignored}}
#pragma acc routine(use) bind(NS::NSFunc)
// expected-error@+3{{'RecordTy' does not refer to a value}}
// expected-note@#RecTy{{declared here}}
// expected-warning@+1{{OpenACC construct 'routine' not yet implemented, pragma ignored}}
#pragma acc routine(use) bind(NS::RecordTy)
// expected-error@+4{{'Value' is a private member of 'NS::RecordTy'}}
// expected-note@#VAL{{implicitly declared private here}}
// expected-warning@+2{{OpenACC clause 'bind' not yet implemented, clause ignored}}
// expected-warning@+1{{OpenACC construct 'routine' not yet implemented, pragma ignored}}
#pragma acc routine(use) bind(NS::RecordTy::Value)
// expected-warning@+2{{OpenACC clause 'bind' not yet implemented, clause ignored}}
// expected-warning@+1{{OpenACC construct 'routine' not yet implemented, pragma ignored}}
#pragma acc routine(use) bind(NS::RecordTy::ValuePub)
// expected-warning@+2{{OpenACC clause 'bind' not yet implemented, clause ignored}}
// expected-warning@+1{{OpenACC construct 'routine' not yet implemented, pragma ignored}}
#pragma acc routine(use) bind(NS::TemplTy<int>)
// expected-error@+2{{no member named 'unknown' in namespace 'NS'}}
// expected-warning@+1{{OpenACC construct 'routine' not yet implemented, pragma ignored}}
#pragma acc routine(use) bind(NS::unknown<int>)
// expected-warning@+2{{OpenACC clause 'bind' not yet implemented, clause ignored}}
// expected-warning@+1{{OpenACC construct 'routine' not yet implemented, pragma ignored}}
#pragma acc routine(use) bind(NS::function)
// expected-error@+4{{'priv_mem_function' is a private member of 'NS::RecordTy'}}
// expected-note@#PrivMemFun{{implicitly declared private here}}
// expected-warning@+2{{OpenACC clause 'bind' not yet implemented, clause ignored}}
// expected-warning@+1{{OpenACC construct 'routine' not yet implemented, pragma ignored}}
#pragma acc routine(use) bind(NS::RecordTy::priv_mem_function)
// expected-warning@+2{{OpenACC clause 'bind' not yet implemented, clause ignored}}
// expected-warning@+1{{OpenACC construct 'routine' not yet implemented, pragma ignored}}
#pragma acc routine(use) bind(NS::RecordTy::mem_function)
// expected-error@+2{{string literal with user-defined suffix cannot be used here}}
// expected-warning@+1{{OpenACC construct 'routine' not yet implemented, pragma ignored}}
#pragma acc routine(use) bind("unknown udl"_UDL)
// expected-warning@+3{{encoding prefix 'u' on an unevaluated string literal has no effect}}
// expected-warning@+2{{OpenACC clause 'bind' not yet implemented, clause ignored}}
// expected-warning@+1{{OpenACC construct 'routine' not yet implemented, pragma ignored}}
#pragma acc routine(use) bind(u"16 bits")
// expected-warning@+3{{encoding prefix 'U' on an unevaluated string literal has no effect}}
// expected-warning@+2{{OpenACC clause 'bind' not yet implemented, clause ignored}}
// expected-warning@+1{{OpenACC construct 'routine' not yet implemented, pragma ignored}}
#pragma acc routine(use) bind(U"32 bits")