[OpenMP] Fix declare simd use on in-class member template function

Return the Decl when parsing the template member declaration so the
'omp declare simd' pragma can be applied to it. Previously a nullptr
was returned causing an error applying the pragma.

Fixes #52700.

Differential Revision: https://reviews.llvm.org/D125493
This commit is contained in:
Mike Rice 2022-05-12 09:33:53 -07:00
parent f01c7583b5
commit 0d67c8a51d
3 changed files with 55 additions and 3 deletions

View File

@ -200,9 +200,12 @@ Decl *Parser::ParseSingleDeclarationAfterTemplate(
if (Context == DeclaratorContext::Member) {
// We are parsing a member template.
ParseCXXClassMemberDeclaration(AS, AccessAttrs, TemplateInfo,
&DiagsFromTParams);
return nullptr;
DeclGroupPtrTy D = ParseCXXClassMemberDeclaration(
AS, AccessAttrs, TemplateInfo, &DiagsFromTParams);
if (!D || !D.get().isSingleDecl())
return nullptr;
return D.get().getSingleDecl();
}
ParsedAttributes prefixAttrs(AttrFactory);

View File

@ -97,6 +97,28 @@ void f(int (&g)[]) {
foo(c, p);
}
struct A {
#pragma omp declare simd linear(a:X)
template<int X, typename T>
T infunc(T a) { return a * 2; }
template<int Y, typename U>
U outfunc(U *a);
};
#pragma omp declare simd linear(a:Y)
template<int Y, typename U>
U A::outfunc(U *a) { return *a * 2; }
void test_member_template()
{
struct A a;
int i = 32;
float f = 1.0;
int t = a.infunc<8, int>(i);
float u = a.outfunc<4, float>(&f);
}
#pragma omp declare simd
#pragma omp declare simd notinbranch aligned(a : 32)
int bar(VV v, float *a) { return 0; }
@ -173,6 +195,8 @@ double Six(int a, float *b, int &c, int *&d, char e, char *f, short g) {
// CHECK-DAG: define {{.+}}@_ZN3TVVILi16EfE6taddpfEPfRS1_(
// CHECK-DAG: define {{.+}}@_ZN3TVVILi16EfE4taddEi(
// CHECK-DAG: define {{.+}}@_Z3fooILi64EEvRAT__iRPf(
// CHECK-DAG: define {{.+}}@_ZN1A6infuncILi8EiEET0_S1_
// CHECK-DAG: define {{.+}}@_ZN1A7outfuncILi4EfEET0_PS1_
// CHECK-DAG: define {{.+}}@_Z3bar2VVPf(
// CHECK-DAG: define {{.+}}@_Z3baz2VVPi(
// CHECK-DAG: define {{.+}}@_Z3bay2VVRPd(
@ -310,6 +334,24 @@ double Six(int a, float *b, int &c, int *&d, char e, char *f, short g) {
// CHECK-DAG: "_ZGVeM64va128U64__Z3fooILi64EEvRAT__iRPf"
// CHECK-DAG: "_ZGVeN64va128U64__Z3fooILi64EEvRAT__iRPf"
// CHECK-DAG: "_ZGVbM4vl8__ZN1A6infuncILi8EiEET0_S1_"
// CHECK-DAG: "_ZGVbN4vl8__ZN1A6infuncILi8EiEET0_S1_"
// CHECK-DAG: "_ZGVcM8vl8__ZN1A6infuncILi8EiEET0_S1_"
// CHECK-DAG: "_ZGVcN8vl8__ZN1A6infuncILi8EiEET0_S1_"
// CHECK-DAG: "_ZGVdM8vl8__ZN1A6infuncILi8EiEET0_S1_"
// CHECK-DAG: "_ZGVdN8vl8__ZN1A6infuncILi8EiEET0_S1_"
// CHECK-DAG: "_ZGVeM16vl8__ZN1A6infuncILi8EiEET0_S1_"
// CHECK-DAG: "_ZGVeN16vl8__ZN1A6infuncILi8EiEET0_S1_"
// CHECK-DAG: "_ZGVbM4vl16__ZN1A7outfuncILi4EfEET0_PS1_"
// CHECK-DAG: "_ZGVbN4vl16__ZN1A7outfuncILi4EfEET0_PS1_"
// CHECK-DAG: "_ZGVcM8vl16__ZN1A7outfuncILi4EfEET0_PS1_"
// CHECK-DAG: "_ZGVcN8vl16__ZN1A7outfuncILi4EfEET0_PS1_"
// CHECK-DAG: "_ZGVdM8vl16__ZN1A7outfuncILi4EfEET0_PS1_"
// CHECK-DAG: "_ZGVdN8vl16__ZN1A7outfuncILi4EfEET0_PS1_"
// CHECK-DAG: "_ZGVeM16vl16__ZN1A7outfuncILi4EfEET0_PS1_"
// CHECK-DAG: "_ZGVeN16vl16__ZN1A7outfuncILi4EfEET0_PS1_"
// CHECK-DAG: "_ZGVbM4vv__Z3bar2VVPf"
// CHECK-DAG: "_ZGVbN4vv__Z3bar2VVPf"
// CHECK-DAG: "_ZGVcM8vv__Z3bar2VVPf"

View File

@ -32,6 +32,13 @@ int main();
#pragma init_seg(compiler)
int main();
struct A {
// expected-error@+1 {{function declaration is expected after 'declare simd' directive}}
#pragma omp declare simd
template<typename T>
T infunc1(T a), infunc2(T a);
};
// expected-error@+1 {{single declaration is expected after 'declare simd' directive}}
#pragma omp declare simd
// expected-note@+1 {{declared here}}