Skip to content

Commit

Permalink
[OpenMP] Fix declare simd use on in-class member template function
Browse files Browse the repository at this point in the history
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
  • Loading branch information
mikerice1969 committed May 13, 2022
1 parent f01c758 commit 0d67c8a
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 3 deletions.
9 changes: 6 additions & 3 deletions clang/lib/Parse/ParseTemplate.cpp
Expand Up @@ -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);
Expand Down
42 changes: 42 additions & 0 deletions clang/test/OpenMP/declare_simd_codegen.cpp
Expand Up @@ -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; }
Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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"
Expand Down
7 changes: 7 additions & 0 deletions clang/test/OpenMP/declare_simd_messages.cpp
Expand Up @@ -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}}
Expand Down

0 comments on commit 0d67c8a

Please sign in to comment.