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

Mike Rice via cfe-commits cfe-commits at lists.llvm.org
Fri May 13 08:28:19 PDT 2022


Author: Mike Rice
Date: 2022-05-13T08:24:55-07:00
New Revision: 0d67c8a51d61cb0fac91f265a424767f072c7d5c

URL: https://github.com/llvm/llvm-project/commit/0d67c8a51d61cb0fac91f265a424767f072c7d5c
DIFF: https://github.com/llvm/llvm-project/commit/0d67c8a51d61cb0fac91f265a424767f072c7d5c.diff

LOG: [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

Added: 
    

Modified: 
    clang/lib/Parse/ParseTemplate.cpp
    clang/test/OpenMP/declare_simd_codegen.cpp
    clang/test/OpenMP/declare_simd_messages.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/Parse/ParseTemplate.cpp b/clang/lib/Parse/ParseTemplate.cpp
index 5687882251a05..e66329e3bfc7e 100644
--- a/clang/lib/Parse/ParseTemplate.cpp
+++ b/clang/lib/Parse/ParseTemplate.cpp
@@ -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);

diff  --git a/clang/test/OpenMP/declare_simd_codegen.cpp b/clang/test/OpenMP/declare_simd_codegen.cpp
index 573dbdbfd69e9..d7bd798798294 100644
--- a/clang/test/OpenMP/declare_simd_codegen.cpp
+++ b/clang/test/OpenMP/declare_simd_codegen.cpp
@@ -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"

diff  --git a/clang/test/OpenMP/declare_simd_messages.cpp b/clang/test/OpenMP/declare_simd_messages.cpp
index a3188de8bd64f..60515965ce3d0 100644
--- a/clang/test/OpenMP/declare_simd_messages.cpp
+++ b/clang/test/OpenMP/declare_simd_messages.cpp
@@ -32,6 +32,13 @@ int main();
 #pragma init_seg(compiler)
 int main();
 
+struct A {
+// expected-error at +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 at +1 {{single declaration is expected after 'declare simd' directive}}
 #pragma omp declare simd
 // expected-note at +1 {{declared here}}


        


More information about the cfe-commits mailing list