llvm-project/clang/test/ParserOpenACC/parse-clauses.cpp
erichkeane 58b77b8581 [OpenACC] Implement 'bind' clause parsing.
'bind' takes either a string literal, or an 'identifier' representing
the device-side function that this routine is intended to 'bind' to
(that is, to call).  However, it seems that the intent is to permit the
'identifier' to reference any function, thus we're implementing this as
an ID expression.

Additionally, while working on this I discovered that the 'routine' ID
expression parsing for C++ wouldn't allow non-static member functions to
be referenced since it expected us to call it, this was fixed as a part
of this patch as the 'bind' support needed it too.  A test was added for
routine.
2024-01-17 14:07:34 -08:00

74 lines
3.0 KiB
C++

// RUN: %clang_cc1 %s -verify -fopenacc
template<unsigned I, typename T>
void templ() {
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
#pragma acc loop collapse(I)
for(;;){}
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
#pragma acc loop collapse(T::value)
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@+1{{OpenACC directives 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 directives not yet implemented, pragma ignored}}
#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 directives not yet implemented, pragma ignored}}
#pragma acc routine(use) bind(NS::RecordTy::Value)
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
#pragma acc routine(use) bind(NS::RecordTy::ValuePub)
// expected-warning@+1{{OpenACC directives 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 directives not yet implemented, pragma ignored}}
#pragma acc routine(use) bind(NS::unknown<int>)
// expected-warning@+1{{OpenACC directives not yet implemented, pragma 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 directives not yet implemented, pragma ignored}}
#pragma acc routine(use) bind(NS::RecordTy::priv_mem_function)
// expected-warning@+1{{OpenACC directives 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 directives not yet implemented, pragma ignored}}
#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 directives not yet implemented, pragma 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 directives not yet implemented, pragma ignored}}
#pragma acc routine(use) bind(U"32 bits")