// RUN: %clang_cc1 %s -fopenacc -verify // expected-error@+1{{use of undeclared identifier 'UnnamedYet'}} #pragma acc routine(UnnamedYet) seq void UnnamedYet(); // expected-error@+1{{use of undeclared identifier 'Invalid'}} #pragma acc routine(Invalid) seq // Fine, since these are the same function. void SameFunc(); #pragma acc routine(SameFunc) seq void SameFunc(); namespace NS { void DifferentFunc(); }; // expected-warning@+2{{OpenACC 'routine' directive with a name refers to a function with the same name as the function on the following line; this may be unintended}} // expected-note@-3{{'DifferentFunc' declared here}} #pragma acc routine(NS::DifferentFunc) seq void DifferentFunc(); void NoMagicStatic() { static int F = 1; } // expected-error@-2{{function static variables are not permitted in functions to which an OpenACC 'routine' directive applies}} // expected-note@+1{{'routine' construct is here}} #pragma acc routine(NoMagicStatic) seq void NoMagicStatic2(); // expected-error@+4{{function static variables are not permitted in functions to which an OpenACC 'routine' directive applies}} // expected-note@+1{{'routine' construct is here}} #pragma acc routine(NoMagicStatic2) seq void NoMagicStatic2() { static int F = 1; } #pragma acc routine seq void NoMagicStatic3() { // expected-error@+2{{function static variables are not permitted in functions to which an OpenACC 'routine' directive applies}} // expected-note@-3{{'routine' construct is here}} static int F = 1; } #pragma acc routine seq void NoMagicStatic4(); void NoMagicStatic4() { // expected-error@+2{{function static variables are not permitted in functions to which an OpenACC 'routine' directive applies}} // expected-note@-4{{'routine' construct is here}} static int F = 1; } void HasMagicStaticLambda() { auto MSLambda = []() { static int I = 5; }; // expected-error@-2{{function static variables are not permitted in functions to which an OpenACC 'routine' directive applies}} // expected-note@+1{{'routine' construct is here}} #pragma acc routine (MSLambda) seq // expected-error@+4{{function static variables are not permitted in functions to which an OpenACC 'routine' directive applies}} // expected-note@+1{{'routine' construct is here}} #pragma acc routine seq auto MSLambda2 = []() { static int I = 5; }; // Properly handle error recovery. // expected-error@+1{{expected function or lambda declaration for 'routine' construct}} #pragma acc routine seq auto MSLambda2 = [](auto) { // expected-error@-1{{redefinition of 'MSLambda2'}} // expected-note@-9{{previous definition is here}} static int I = 5; }; // expected-error@+4{{function static variables are not permitted in functions to which an OpenACC 'routine' directive applies}} // expected-note@+1{{'routine' construct is here}} #pragma acc routine seq auto MSLambda3 = [](auto) { static int I = 5; }; } auto Lambda = [](){}; #pragma acc routine(Lambda) seq #pragma acc routine seq auto Lambda2 = [](){}; auto GenLambda = [](auto){}; // expected-error@+1{{OpenACC routine name 'GenLambda' names a set of overloads}} #pragma acc routine(GenLambda) seq #pragma acc routine seq auto GenLambda2 = [](auto){}; // Variable? // expected-error@+1{{expected function or lambda declaration for 'routine' construct}} #pragma acc routine seq int Variable; // Plain function #pragma acc routine seq int function(); #pragma acc routine (function) seq // expected-error@+1{{OpenACC routine name 'Variable' does not name a function}} #pragma acc routine (Variable) seq // Var template? // expected-error@+1{{expected function or lambda declaration for 'routine' construct}} #pragma acc routine seq template T VarTempl = 0; // expected-error@+2{{use of variable template 'VarTempl' requires template arguments}} // expected-note@-2{{template is declared here}} #pragma acc routine (VarTempl) seq // expected-error@+1{{OpenACC routine name 'VarTempl' does not name a function}} #pragma acc routine (VarTempl) seq // Function in NS namespace NS { int NSFunc(); auto Lambda = [](){}; } #pragma acc routine(NS::NSFunc) seq #pragma acc routine(NS::Lambda) seq // Ambiguous Function int ambig_func(); int ambig_func(int); // expected-error@+1{{OpenACC routine name 'ambig_func' names a set of overloads}} #pragma acc routine (ambig_func) seq #pragma acc routine seq int ambig_func2(); #pragma acc routine seq int ambig_func2(int); // Ambiguous in NS namespace NS { int ambig_func(); int ambig_func(int); } // expected-error@+1{{OpenACC routine name 'NS::ambig_func' names a set of overloads}} #pragma acc routine (NS::ambig_func) seq // function template template void templ_func(); #pragma acc routine seq template void templ_func2(); // expected-error@+1{{OpenACC routine name 'templ_func' names a set of overloads}} #pragma acc routine(templ_func) seq // expected-error@+1{{OpenACC routine name 'templ_func' names a set of overloads}} #pragma acc routine(templ_func) seq // expected-error@+1{{OpenACC routine name 'templ_func' names a set of overloads}} #pragma acc routine(templ_func) seq struct S { void MemFunc(); #pragma acc routine seq void MemFunc2(); static void StaticMemFunc(); #pragma acc routine seq static void StaticMemFunc2(); template void TemplMemFunc(); #pragma acc routine seq template void TemplMemFunc2(); template static void TemplStaticMemFunc(); #pragma acc routine seq template static void TemplStaticMemFunc2(); void MemFuncAmbig(); void MemFuncAmbig(int); template void TemplMemFuncAmbig(); template void TemplMemFuncAmbig(int); int Field; constexpr static auto Lambda = [](){}; #pragma acc routine seq constexpr static auto Lambda2 = [](){}; #pragma acc routine seq constexpr static auto Lambda3 = [](auto){}; #pragma acc routine(S::MemFunc) seq #pragma acc routine(S::StaticMemFunc) seq #pragma acc routine(S::Lambda) seq // expected-error@+1{{OpenACC routine name 'S::TemplMemFunc' names a set of overloads}} #pragma acc routine(S::TemplMemFunc) seq // expected-error@+1{{OpenACC routine name 'S::TemplStaticMemFunc' names a set of overloads}} #pragma acc routine(S::TemplStaticMemFunc) seq // expected-error@+1{{OpenACC routine name 'S::template TemplMemFunc' names a set of overloads}} #pragma acc routine(S::template TemplMemFunc) seq // expected-error@+1{{OpenACC routine name 'S::template TemplStaticMemFunc' names a set of overloads}} #pragma acc routine(S::template TemplStaticMemFunc) seq // expected-error@+1{{OpenACC routine name 'S::MemFuncAmbig' names a set of overloads}} #pragma acc routine(S::MemFuncAmbig) seq // expected-error@+1{{OpenACC routine name 'S::TemplMemFuncAmbig' names a set of overloads}} #pragma acc routine(S::TemplMemFuncAmbig) seq // expected-error@+1{{OpenACC routine name 'S::template TemplMemFuncAmbig' names a set of overloads}} #pragma acc routine(S::template TemplMemFuncAmbig) seq // expected-error@+1{{OpenACC routine name 'S::Field' does not name a function}} #pragma acc routine(S::Field) seq }; #pragma acc routine(S::MemFunc) seq #pragma acc routine(S::StaticMemFunc) seq #pragma acc routine(S::Lambda) seq // expected-error@+1{{OpenACC routine name 'S::TemplMemFunc' names a set of overloads}} #pragma acc routine(S::TemplMemFunc) seq // expected-error@+1{{OpenACC routine name 'S::TemplStaticMemFunc' names a set of overloads}} #pragma acc routine(S::TemplStaticMemFunc) seq // expected-error@+1{{OpenACC routine name 'S::template TemplMemFunc' names a set of overloads}} #pragma acc routine(S::template TemplMemFunc) seq // expected-error@+1{{OpenACC routine name 'S::template TemplStaticMemFunc' names a set of overloads}} #pragma acc routine(S::template TemplStaticMemFunc) seq // expected-error@+1{{OpenACC routine name 'S::MemFuncAmbig' names a set of overloads}} #pragma acc routine(S::MemFuncAmbig) seq // expected-error@+1{{OpenACC routine name 'S::TemplMemFuncAmbig' names a set of overloads}} #pragma acc routine(S::TemplMemFuncAmbig) seq // expected-error@+1{{OpenACC routine name 'S::template TemplMemFuncAmbig' names a set of overloads}} #pragma acc routine(S::template TemplMemFuncAmbig) seq // expected-error@+1{{OpenACC routine name 'S::Field' does not name a function}} #pragma acc routine(S::Field) seq constexpr auto getLambda() { return [](){}; } template constexpr auto getTemplLambda() { return [](T){}; } constexpr auto getDepLambda() { return [](auto){}; } template constexpr auto getTemplDepLambda() { return [](auto){}; } template struct DepS { // #DEPS void MemFunc(); static void StaticMemFunc(); template void TemplMemFunc(); template static void TemplStaticMemFunc(); void MemFuncAmbig(); void MemFuncAmbig(int); template void TemplMemFuncAmbig(); template void TemplMemFuncAmbig(int); int Field; constexpr static auto Lambda = [](){}; // expected-error@+2{{non-const static data member must be initialized out of line}} // expected-note@#DEPSInst{{in instantiation of template class}} static auto LambdaBroken = [](){}; #pragma acc routine seq constexpr static auto LambdaKinda = getLambda(); // FIXME: We can't really handle this/things like this, see comment in // SemaOpenACC.cpp's LegalizeNextParsedDecl. // expected-error@+1{{expected function or lambda declaration for 'routine' construct}} #pragma acc routine seq constexpr static auto LambdaKinda2 = getTemplLambda(); #pragma acc routine seq constexpr static auto DepLambdaKinda = getDepLambda(); // expected-error@+1{{expected function or lambda declaration for 'routine' construct}} #pragma acc routine seq constexpr static auto DepLambdaKinda2 = getTemplDepLambda(); // expected-error@+1{{expected function or lambda declaration for 'routine' construct}} #pragma acc routine seq constexpr static auto Bad = T{}; #pragma acc routine seq constexpr static auto LambdaHasMagicStatic = []() { // expected-error@+2{{function static variables are not permitted in functions to which an OpenACC 'routine' directive applies}} // expected-note@-3{{'routine' construct is here}} static int F = 1; }; void HasMagicStatic() { static int F = 1; // #HasMagicStaticFunc } void HasMagicStatic2() { static int F = 1; // #HasMagicStaticFunc2 } #pragma acc routine(DepS::MemFunc) seq #pragma acc routine(DepS::StaticMemFunc) seq #pragma acc routine(DepS::Lambda) seq #pragma acc routine(DepS::LambdaBroken) seq // expected-error@+1{{OpenACC routine name 'DepS::TemplMemFunc' names a set of overloads}} #pragma acc routine(DepS::TemplMemFunc) seq // expected-error@+1{{OpenACC routine name 'DepS::TemplStaticMemFunc' names a set of overloads}} #pragma acc routine(DepS::TemplStaticMemFunc) seq // expected-error@+1{{OpenACC routine name 'DepS::template TemplMemFunc' names a set of overloads}} #pragma acc routine(DepS::template TemplMemFunc) seq // expected-error@+1{{OpenACC routine name 'DepS::template TemplStaticMemFunc' names a set of overloads}} #pragma acc routine(DepS::template TemplStaticMemFunc) seq // expected-error@+1{{OpenACC routine name 'DepS::MemFuncAmbig' names a set of overloads}} #pragma acc routine(DepS::MemFuncAmbig) seq // expected-error@+1{{OpenACC routine name 'DepS::TemplMemFuncAmbig' names a set of overloads}} #pragma acc routine(DepS::TemplMemFuncAmbig) seq // expected-error@+1{{OpenACC routine name 'DepS::template TemplMemFuncAmbig' names a set of overloads}} #pragma acc routine(DepS::template TemplMemFuncAmbig) seq // expected-error@+1{{OpenACC routine name 'DepS::Field' does not name a function}} #pragma acc routine(DepS::Field) seq #pragma acc routine(DepS::MemFunc) seq #pragma acc routine(DepS::StaticMemFunc) seq #pragma acc routine(DepS::Lambda) seq #pragma acc routine(DepS::LambdaBroken) seq // expected-error@+1{{OpenACC routine name 'DepS::TemplMemFunc' names a set of overloads}} #pragma acc routine(DepS::TemplMemFunc) seq // expected-error@+1{{OpenACC routine name 'DepS::TemplStaticMemFunc' names a set of overloads}} #pragma acc routine(DepS::TemplStaticMemFunc) seq // expected-error@+1{{OpenACC routine name 'DepS::template TemplMemFunc' names a set of overloads}} #pragma acc routine(DepS::template TemplMemFunc) seq // expected-error@+1{{OpenACC routine name 'DepS::template TemplStaticMemFunc' names a set of overloads}} #pragma acc routine(DepS::template TemplStaticMemFunc) seq // expected-error@+1{{OpenACC routine name 'DepS::MemFuncAmbig' names a set of overloads}} #pragma acc routine(DepS::MemFuncAmbig) seq // expected-error@+1{{OpenACC routine name 'DepS::TemplMemFuncAmbig' names a set of overloads}} #pragma acc routine(DepS::TemplMemFuncAmbig) seq // expected-error@+1{{OpenACC routine name 'DepS::template TemplMemFuncAmbig' names a set of overloads}} #pragma acc routine(DepS::template TemplMemFuncAmbig) seq // expected-error@+1{{OpenACC routine name 'DepS::Field' does not name a function}} #pragma acc routine(DepS::Field) seq // FIXME: We could do better about suppressing this double diagnostic, but we // don't want to invalidate the vardecl for openacc, so we don't have a good // way to do this in the AST. // expected-error@#HasMagicStaticFunc 2{{function static variables are not permitted in functions to which an OpenACC 'routine' directive applies}} // expected-note@+2 2{{'routine' construct is here}} // expected-note@+1{{in instantiation of member function}}} #pragma acc routine(DepS::HasMagicStatic) seq }; template void DepF() { #pragma acc routine seq auto LambdaKinda = getLambda(); // expected-error@+1{{expected function or lambda declaration for 'routine' construct}} #pragma acc routine seq auto LambdaKinda2 = getTemplLambda(); #pragma acc routine seq auto DepLambdaKinda = getDepLambda(); // expected-error@+1{{expected function or lambda declaration for 'routine' construct}} #pragma acc routine seq auto DepLambdaKinda2 = getTemplDepLambda(); // expected-error@+1{{expected function or lambda declaration for 'routine' construct}} #pragma acc routine seq constexpr static auto Bad = T{}; } void Inst() { DepS S; // #DEPSInst S.HasMagicStatic2(); DepF(); // #DEPFInst } //expected-error@+2{{use of class template 'DepS' requires template arguments}} // expected-note@#DEPS{{template is declared here}} #pragma acc routine(DepS::Lambda) seq //expected-error@+2{{use of class template 'DepS' requires template arguments}} // expected-note@#DEPS{{template is declared here}} #pragma acc routine(DepS::MemFunc) seq //expected-error@+2{{use of class template 'DepS' requires template arguments}} // expected-note@#DEPS{{template is declared here}} #pragma acc routine(DepS::StaticMemFunc) seq //expected-error@+2{{use of class template 'DepS' requires template arguments}} // expected-note@#DEPS{{template is declared here}} #pragma acc routine(DepS::TemplMemFunc) seq //expected-error@+2{{use of class template 'DepS' requires template arguments}} // expected-note@#DEPS{{template is declared here}} #pragma acc routine(DepS::TemplStaticMemFunc) seq //expected-error@+2{{use of class template 'DepS' requires template arguments}} // expected-note@#DEPS{{template is declared here}} #pragma acc routine(DepS::TemplMemFunc) seq //expected-error@+2{{use of class template 'DepS' requires template arguments}} // expected-note@#DEPS{{template is declared here}} #pragma acc routine(DepS::TemplStaticMemFunc) seq //expected-error@+2{{use of class template 'DepS' requires template arguments}} // expected-note@#DEPS{{template is declared here}} #pragma acc routine(DepS::MemFuncAmbig) seq //expected-error@+2{{use of class template 'DepS' requires template arguments}} // expected-note@#DEPS{{template is declared here}} #pragma acc routine(DepS::TemplMemFuncAmbig) seq //expected-error@+2{{use of class template 'DepS' requires template arguments}} // expected-note@#DEPS{{template is declared here}} #pragma acc routine(DepS::TemplMemFuncAmbig) seq //expected-error@+2{{use of class template 'DepS' requires template arguments}} // expected-note@#DEPS{{template is declared here}} #pragma acc routine(DepS::Field) seq //expected-error@+1{{use of undeclared identifier 'T'}} #pragma acc routine(DepS::Lambda) seq //expected-error@+1{{use of undeclared identifier 'T'}} #pragma acc routine(DepS::MemFunc) seq //expected-error@+1{{use of undeclared identifier 'T'}} #pragma acc routine(DepS::StaticMemFunc) seq //expected-error@+1{{use of undeclared identifier 'T'}} #pragma acc routine(DepS::TemplMemFunc) seq //expected-error@+1{{use of undeclared identifier 'T'}} #pragma acc routine(DepS::TemplStaticMemFunc) seq //expected-error@+1{{use of undeclared identifier 'T'}} #pragma acc routine(DepS::TemplMemFunc) seq //expected-error@+1{{use of undeclared identifier 'T'}} #pragma acc routine(DepS::TemplStaticMemFunc) seq //expected-error@+1{{use of undeclared identifier 'T'}} #pragma acc routine(DepS::MemFuncAmbig) seq //expected-error@+1{{use of undeclared identifier 'T'}} #pragma acc routine(DepS::TemplMemFuncAmbig) seq //expected-error@+1{{use of undeclared identifier 'T'}} #pragma acc routine(DepS::TemplMemFuncAmbig) seq //expected-error@+1{{use of undeclared identifier 'T'}} #pragma acc routine(DepS::Field) seq #pragma acc routine(DepS::Lambda) seq #pragma acc routine(DepS::LambdaBroken) seq #pragma acc routine(DepS::MemFunc) seq #pragma acc routine(DepS::StaticMemFunc) seq // expected-error@+1{{OpenACC routine name 'DepS::TemplMemFunc' names a set of overloads}} #pragma acc routine(DepS::TemplMemFunc) seq // expected-error@+1{{OpenACC routine name 'DepS::TemplStaticMemFunc' names a set of overloads}} #pragma acc routine(DepS::TemplStaticMemFunc) seq // expected-error@+1{{OpenACC routine name 'DepS::TemplMemFunc' names a set of overloads}} #pragma acc routine(DepS::TemplMemFunc) seq // expected-error@+1{{OpenACC routine name 'DepS::TemplStaticMemFunc' names a set of overloads}} #pragma acc routine(DepS::TemplStaticMemFunc) seq // expected-error@+1{{OpenACC routine name 'DepS::MemFuncAmbig' names a set of overloads}} #pragma acc routine(DepS::MemFuncAmbig) seq // expected-error@+1{{OpenACC routine name 'DepS::TemplMemFuncAmbig' names a set of overloads}} #pragma acc routine(DepS::TemplMemFuncAmbig) seq // expected-error@+1{{OpenACC routine name 'DepS::TemplMemFuncAmbig' names a set of overloads}} #pragma acc routine(DepS::TemplMemFuncAmbig) seq // expected-error@+1{{OpenACC routine name 'DepS::Field' does not name a function}} #pragma acc routine(DepS::Field) seq // expected-error@#HasMagicStaticFunc2{{function static variables are not permitted in functions to which an OpenACC 'routine' directive applies}} // expected-note@+2{{'routine' construct is here}} // expected-note@+1{{in instantiation of member function}}} #pragma acc routine(DepS::HasMagicStatic2) seq template void TemplFunc() { #pragma acc routine(T::MemFunc) seq #pragma acc routine(T::StaticMemFunc) seq #pragma acc routine(T::Lambda) seq // expected-error@+1{{OpenACC routine name 'S::TemplMemFunc' names a set of overloads}} #pragma acc routine(T::TemplMemFunc) seq // expected-error@+1{{OpenACC routine name 'S::TemplStaticMemFunc' names a set of overloads}} #pragma acc routine(T::TemplStaticMemFunc) seq // expected-error@+1{{OpenACC routine name 'S::template TemplMemFunc' names a set of overloads}} #pragma acc routine(T::template TemplMemFunc) seq // expected-error@+1{{OpenACC routine name 'S::template TemplStaticMemFunc' names a set of overloads}} #pragma acc routine(T::template TemplStaticMemFunc) seq // expected-error@+1{{OpenACC routine name 'S::MemFuncAmbig' names a set of overloads}} #pragma acc routine(T::MemFuncAmbig) seq // expected-error@+1{{OpenACC routine name 'S::TemplMemFuncAmbig' names a set of overloads}} #pragma acc routine(T::TemplMemFuncAmbig) seq // expected-error@+1{{OpenACC routine name 'S::template TemplMemFuncAmbig' names a set of overloads}} #pragma acc routine(T::template TemplMemFuncAmbig) seq // expected-error@+1{{OpenACC routine name 'S::Field' does not name a function}} #pragma acc routine(T::Field) seq } template struct DepRefersToT { #pragma acc routine(T::MemFunc) seq #pragma acc routine(T::StaticMemFunc) seq #pragma acc routine(T::Lambda) seq // expected-error@+1{{OpenACC routine name 'S::TemplMemFunc' names a set of overloads}} #pragma acc routine(T::TemplMemFunc) seq // expected-error@+1{{OpenACC routine name 'S::TemplStaticMemFunc' names a set of overloads}} #pragma acc routine(T::TemplStaticMemFunc) seq // expected-error@+1{{OpenACC routine name 'S::template TemplMemFunc' names a set of overloads}} #pragma acc routine(T::template TemplMemFunc) seq // expected-error@+1{{OpenACC routine name 'S::template TemplStaticMemFunc' names a set of overloads}} #pragma acc routine(T::template TemplStaticMemFunc) seq // expected-error@+1{{OpenACC routine name 'S::MemFuncAmbig' names a set of overloads}} #pragma acc routine(T::MemFuncAmbig) seq // expected-error@+1{{OpenACC routine name 'S::TemplMemFuncAmbig' names a set of overloads}} #pragma acc routine(T::TemplMemFuncAmbig) seq // expected-error@+1{{OpenACC routine name 'S::template TemplMemFuncAmbig' names a set of overloads}} #pragma acc routine(T::template TemplMemFuncAmbig) seq // expected-error@+1{{OpenACC routine name 'S::Field' does not name a function}} #pragma acc routine(T::Field) seq void MemFunc() { #pragma acc routine(T::MemFunc) seq #pragma acc routine(T::StaticMemFunc) seq #pragma acc routine(T::Lambda) seq // expected-error@+1{{OpenACC routine name 'S::TemplMemFunc' names a set of overloads}} #pragma acc routine(T::TemplMemFunc) seq // expected-error@+1{{OpenACC routine name 'S::TemplStaticMemFunc' names a set of overloads}} #pragma acc routine(T::TemplStaticMemFunc) seq // expected-error@+1{{OpenACC routine name 'S::template TemplMemFunc' names a set of overloads}} #pragma acc routine(T::template TemplMemFunc) seq // expected-error@+1{{OpenACC routine name 'S::template TemplStaticMemFunc' names a set of overloads}} #pragma acc routine(T::template TemplStaticMemFunc) seq // expected-error@+1{{OpenACC routine name 'S::MemFuncAmbig' names a set of overloads}} #pragma acc routine(T::MemFuncAmbig) seq // expected-error@+1{{OpenACC routine name 'S::TemplMemFuncAmbig' names a set of overloads}} #pragma acc routine(T::TemplMemFuncAmbig) seq // expected-error@+1{{OpenACC routine name 'S::template TemplMemFuncAmbig' names a set of overloads}} #pragma acc routine(T::template TemplMemFuncAmbig) seq // expected-error@+1{{OpenACC routine name 'S::Field' does not name a function}} #pragma acc routine(T::Field) seq } template void TemplMemFunc() { #pragma acc routine(T::MemFunc) seq #pragma acc routine(T::StaticMemFunc) seq #pragma acc routine(T::Lambda) seq // expected-error@+1{{OpenACC routine name 'S::TemplMemFunc' names a set of overloads}} #pragma acc routine(T::TemplMemFunc) seq // expected-error@+1{{OpenACC routine name 'S::TemplStaticMemFunc' names a set of overloads}} #pragma acc routine(T::TemplStaticMemFunc) seq // expected-error@+1{{OpenACC routine name 'S::template TemplMemFunc' names a set of overloads}} #pragma acc routine(T::template TemplMemFunc) seq // expected-error@+1{{OpenACC routine name 'S::template TemplStaticMemFunc' names a set of overloads}} #pragma acc routine(T::template TemplStaticMemFunc) seq // expected-error@+1{{OpenACC routine name 'S::MemFuncAmbig' names a set of overloads}} #pragma acc routine(T::MemFuncAmbig) seq // expected-error@+1{{OpenACC routine name 'S::TemplMemFuncAmbig' names a set of overloads}} #pragma acc routine(T::TemplMemFuncAmbig) seq // expected-error@+1{{OpenACC routine name 'S::template TemplMemFuncAmbig' names a set of overloads}} #pragma acc routine(T::template TemplMemFuncAmbig) seq // expected-error@+1{{OpenACC routine name 'S::Field' does not name a function}} #pragma acc routine(T::Field) seq // expected-error@+1{{expected function or lambda declaration for 'routine' construct}} #pragma acc routine seq auto L = getTemplLambda(); // expected-error@+1{{expected function or lambda declaration for 'routine' construct}} #pragma acc routine seq auto L2 = getTemplDepLambda(); } }; void inst() { TemplFunc(); // expected-note{{in instantiation of}} DepRefersToT s; // expected-note{{in instantiation of}} s.MemFunc(); // expected-note{{in instantiation of}} s.TemplMemFunc(); // expected-note{{in instantiation of}} } // A.3.4 tests: void DiffFuncs(); // #GLOBALDIFFFUNCS namespace NS { // expected-warning@+2{{OpenACC 'routine' directive with a name refers to a function with the same name as the function on the following line; this may be unintended}} // expected-note@#GLOBALDIFFFUNCS{{'DiffFuncs' declared here}} #pragma acc routine(DiffFuncs) seq void DiffFuncs(); } void has_diff_func() { // expected-warning@+2{{OpenACC 'routine' directive with a name refers to a function with the same name as the function on the following line; this may be unintended}} // expected-note@#GLOBALDIFFFUNCS{{'DiffFuncs' declared here}} #pragma acc routine(DiffFuncs) seq auto DiffFuncs = [](){}; } template void has_diff_func_templ() { // expected-warning@+3{{OpenACC 'routine' directive with a name refers to a function with the same name as the function on the following line; this may be unintended}} // expected-note@#GLOBALDIFFFUNCS{{'DiffFuncs' declared here}} // expected-note@#HDFT_INST{{in instantiation of function template specialization}} #pragma acc routine(DiffFuncs) seq auto DiffFuncs = [](){}; } void inst_diff() { has_diff_func_templ();// #HDFT_INST } struct SDiff { // expected-warning@+2{{OpenACC 'routine' directive with a name refers to a function with the same name as the function on the following line; this may be unintended}} // expected-note@#GLOBALDIFFFUNCS{{'DiffFuncs' declared here}} #pragma acc routine(DiffFuncs) seq void DiffFuncs(); }; template struct TemplSDiff { // expected-warning@+2{{OpenACC 'routine' directive with a name refers to a function with the same name as the function on the following line; this may be unintended}} // expected-note@#GLOBALDIFFFUNCS{{'DiffFuncs' declared here}} #pragma acc routine(DiffFuncs) seq void DiffFuncs(); }; struct SOperator { #pragma acc routine(DiffFuncs) seq bool operator==(const S&); }; namespace NS2 { // Shouldn't diagnose. #pragma acc routine(DiffFuncs) seq #pragma acc routine seq void DiffFuncs(); };