'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.
74 lines
3.0 KiB
C++
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")
|