diff mbox series

[OG13,committed,2/3] OpenMP: C++ attribute syntax fixes/testcases for "declare mapper"

Message ID 20230818173938.430758-3-sandra@codesourcery.com
State New
Headers show
Series C++ attribute syntax fixes/testcases | expand

Commit Message

Sandra Loosemore Aug. 18, 2023, 5:39 p.m. UTC
gcc/c-family/ChangeLog
	* c-omp.cc (c_omp_directives): Uncomment "declare mapper" entry.

gcc/cp/ChangeLog
	* parser.cc (cp_parser_omp_declare_mapper): Allow commas between
	clauses.

gcc/testsuite/ChangeLog
	* g++.dg/gomp/attrs-declare-mapper-3.C: New file.
	* g++.dg/gomp/attrs-declare-mapper-4.C: New file.
	* g++.dg/gomp/attrs-declare-mapper-5.C: New file.
	* g++.dg/gomp/attrs-declare-mapper-6.C: New file.
---
 gcc/c-family/ChangeLog.omp                    |  4 +
 gcc/c-family/c-omp.cc                         |  4 +-
 gcc/cp/ChangeLog.omp                          |  5 ++
 gcc/cp/parser.cc                              |  2 +
 gcc/testsuite/ChangeLog.omp                   |  7 ++
 .../g++.dg/gomp/attrs-declare-mapper-3.C      | 31 ++++++++
 .../g++.dg/gomp/attrs-declare-mapper-4.C      | 74 +++++++++++++++++++
 .../g++.dg/gomp/attrs-declare-mapper-5.C      | 26 +++++++
 .../g++.dg/gomp/attrs-declare-mapper-6.C      | 22 ++++++
 9 files changed, 173 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/gomp/attrs-declare-mapper-3.C
 create mode 100644 gcc/testsuite/g++.dg/gomp/attrs-declare-mapper-4.C
 create mode 100644 gcc/testsuite/g++.dg/gomp/attrs-declare-mapper-5.C
 create mode 100644 gcc/testsuite/g++.dg/gomp/attrs-declare-mapper-6.C
diff mbox series

Patch

diff --git a/gcc/c-family/ChangeLog.omp b/gcc/c-family/ChangeLog.omp
index 60f5c29276f..40cb8e811e5 100644
--- a/gcc/c-family/ChangeLog.omp
+++ b/gcc/c-family/ChangeLog.omp
@@ -1,3 +1,7 @@ 
+2023-08-18  Sandra Loosemore  <sandra@codesourcery.com>
+
+	* c-omp.cc (c_omp_directives): Uncomment "declare mapper" entry.
+
 2023-08-10  Julian Brown  <julian@codesourcery.com>
 
 	* c-common.h (c_omp_region_type): Add C_ORT_UPDATE and C_ORT_OMP_UPDATE
diff --git a/gcc/c-family/c-omp.cc b/gcc/c-family/c-omp.cc
index 9ff09b59bc6..7bc69e9e2da 100644
--- a/gcc/c-family/c-omp.cc
+++ b/gcc/c-family/c-omp.cc
@@ -5500,8 +5500,8 @@  const struct c_omp_directive c_omp_directives[] = {
     C_OMP_DIR_STANDALONE, false },
   { "critical", nullptr, nullptr, PRAGMA_OMP_CRITICAL,
     C_OMP_DIR_CONSTRUCT, false },
-  /* { "declare", "mapper", nullptr, PRAGMA_OMP_DECLARE,
-    C_OMP_DIR_DECLARATIVE, false },  */
+  { "declare", "mapper", nullptr, PRAGMA_OMP_DECLARE,
+    C_OMP_DIR_DECLARATIVE, false },
   { "declare", "reduction", nullptr, PRAGMA_OMP_DECLARE,
     C_OMP_DIR_DECLARATIVE, true },
   { "declare", "simd", nullptr, PRAGMA_OMP_DECLARE,
diff --git a/gcc/cp/ChangeLog.omp b/gcc/cp/ChangeLog.omp
index 6e154ea3426..1b2d71422d8 100644
--- a/gcc/cp/ChangeLog.omp
+++ b/gcc/cp/ChangeLog.omp
@@ -1,3 +1,8 @@ 
+2023-08-18  Sandra Loosemore  <sandra@codesourcery.com>
+
+	* parser.cc (cp_parser_omp_declare_mapper): Allow commas between
+	clauses.
+
 2023-08-18  Sandra Loosemore  <sandra@codesourcery.com>
 
 	* parser.cc (analyze_metadirective_body): Handle CPP_PRAGMA and
diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc
index 84ec0de6c69..0ce2a7be608 100644
--- a/gcc/cp/parser.cc
+++ b/gcc/cp/parser.cc
@@ -50358,6 +50358,8 @@  cp_parser_omp_declare_mapper (cp_parser *parser, cp_token *pragma_tok,
 
   while (cp_lexer_next_token_is_not (parser->lexer, CPP_PRAGMA_EOL))
     {
+      if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
+	cp_lexer_consume_token (parser->lexer);
       pragma_omp_clause c_kind = cp_parser_omp_clause_name (parser);
       if (c_kind != PRAGMA_OMP_CLAUSE_MAP)
 	{
diff --git a/gcc/testsuite/ChangeLog.omp b/gcc/testsuite/ChangeLog.omp
index a9b4ac3d0a7..a7d11777988 100644
--- a/gcc/testsuite/ChangeLog.omp
+++ b/gcc/testsuite/ChangeLog.omp
@@ -1,3 +1,10 @@ 
+2023-08-18  Sandra Loosemore  <sandra@codesourcery.com>
+
+	* g++.dg/gomp/attrs-declare-mapper-3.C: New file.
+	* g++.dg/gomp/attrs-declare-mapper-4.C: New file.
+	* g++.dg/gomp/attrs-declare-mapper-5.C: New file.
+	* g++.dg/gomp/attrs-declare-mapper-6.C: New file.
+
 2023-08-18  Sandra Loosemore  <sandra@codesourcery.com>
 
 	* g++.dg/gomp/attrs-metadirective-1.C: New file.
diff --git a/gcc/testsuite/g++.dg/gomp/attrs-declare-mapper-3.C b/gcc/testsuite/g++.dg/gomp/attrs-declare-mapper-3.C
new file mode 100644
index 00000000000..36345fe0dc2
--- /dev/null
+++ b/gcc/testsuite/g++.dg/gomp/attrs-declare-mapper-3.C
@@ -0,0 +1,31 @@ 
+// { dg-do compile { target c++11 } } 
+// { dg-additional-options "-fdump-tree-gimple" }
+
+#include <stdlib.h>
+
+// Test named mapper invocation.
+
+struct S {
+  int *ptr;
+  int size;
+};
+
+int main (int argc, char *argv[])
+{
+  int N = 1024;
+  [[omp::directive (declare mapper (mapN:struct S s)
+		    map(to:s.ptr, s.size)
+		    map(s.ptr[:N]))]];
+
+  struct S s;
+  s.ptr = (int *) malloc (sizeof (int) * N);
+
+  [[omp::directive (target map(mapper(mapN), tofrom: s))]]
+// { dg-final { scan-tree-dump {map\(struct:s \[len: 2\]\) map\(alloc:s\.ptr \[len: [0-9]+\]\) map\(to:s\.size \[len: [0-9]+\]\) map\(tofrom:\*_[0-9]+ \[len: _[0-9]+\]\) map\(attach:s\.ptr \[bias: 0\]\)} "gimple" } }
+  {
+    for (int i = 0; i < N; i++)
+      s.ptr[i]++;
+  }
+
+  return 0;
+}
diff --git a/gcc/testsuite/g++.dg/gomp/attrs-declare-mapper-4.C b/gcc/testsuite/g++.dg/gomp/attrs-declare-mapper-4.C
new file mode 100644
index 00000000000..75cb48e8e44
--- /dev/null
+++ b/gcc/testsuite/g++.dg/gomp/attrs-declare-mapper-4.C
@@ -0,0 +1,74 @@ 
+/* { dg-do compile { target c++11 } } */
+/* { dg-additional-options "-fdump-tree-original" } */
+
+/* Check mapper binding clauses.  */
+
+struct Y {
+  int z;
+};
+
+struct Z {
+  int z;
+};
+
+[[omp::directive (declare mapper (struct Y y) map(tofrom: y))]];
+[[omp::directive (declare mapper (struct Z z) map(tofrom: z))]];
+
+int foo (void)
+{
+  struct Y yy;
+  struct Z zz;
+  int dummy;
+
+  [[omp::directive (target data map(dummy))]]
+  {
+    [[omp::directive (target)]]
+    {
+      yy.z++;
+      zz.z++;
+    }
+    yy.z++;
+  }
+  return yy.z;
+}
+
+struct P
+{
+  struct Z *zp;
+};
+
+int bar (void)
+{
+  struct Y yy;
+  struct Z zz;
+  struct P pp;
+  struct Z t;
+  int dummy;
+
+  pp.zp = &t;
+
+  [[omp::directive (declare mapper (struct Y y) map(tofrom: y.z))]];
+  [[omp::directive (declare mapper (struct Z z) map(tofrom: z.z))]];
+
+  [[omp::directive (target data map(dummy))]]
+  {
+    [[omp::directive (target)]]
+    {
+      yy.z++;
+      zz.z++;
+    }
+    yy.z++;
+  }
+
+  [[omp::directive (declare mapper(struct P x) map(to:x.zp), map(tofrom:*x.zp))]];
+
+  [[omp::directive (target)]]
+  {
+    zz = *pp.zp;
+  }
+
+  return zz.z;
+}
+
+/* { dg-final { scan-tree-dump-times {mapper_binding\(struct Y,omp declare mapper ~1Y\) mapper_binding\(struct Z,omp declare mapper ~1Z\)} 2 "original" { target c++ } } } */
+/* { dg-final { scan-tree-dump {mapper_binding\(struct Z,omp declare mapper ~1Z\) mapper_binding\(struct P,omp declare mapper ~1P\)} "original" { target c++ } } } */
diff --git a/gcc/testsuite/g++.dg/gomp/attrs-declare-mapper-5.C b/gcc/testsuite/g++.dg/gomp/attrs-declare-mapper-5.C
new file mode 100644
index 00000000000..711f058dc2b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/gomp/attrs-declare-mapper-5.C
@@ -0,0 +1,26 @@ 
+/* { dg-do compile { target c++11 } } */
+
+typedef struct S_ {
+  int *myarr;
+  int size;
+} S;
+
+[[omp::directive (declare mapper (named: struct S_ v)
+		  map(to:v.size, v.myarr)
+		  map(tofrom: v.myarr[0:v.size]))]];
+/* { dg-note "'#pragma omp declare mapper \\(named: S_\\)' previously defined here" "" { target c++ } .-3 } */
+
+[[omp::directive (declare mapper (named: S v)
+		  map(to:v.size, v.myarr) 
+		  map(tofrom: v.myarr[0:v.size]))]];
+/* { dg-error "redefinition of '#pragma omp declare mapper \\(named: S\\)'" "" { target c++ } .-3 } */
+
+[[omp::directive (declare mapper (struct S_ v)
+		  map(to:v.size, v.myarr)
+		  map(tofrom: v.myarr[0:v.size]))]];
+/* { dg-note "'#pragma omp declare mapper \\(S_\\)' previously defined here" "" { target c++ } .-3 } */
+
+[[omp::directive (declare mapper (S v)
+		  map(to:v.size, v.myarr)
+		  map(tofrom: v.myarr[0:v.size]))]];
+/* { dg-error "redefinition of '#pragma omp declare mapper \\(S\\)'" "" { target c++ } .-3 } */
diff --git a/gcc/testsuite/g++.dg/gomp/attrs-declare-mapper-6.C b/gcc/testsuite/g++.dg/gomp/attrs-declare-mapper-6.C
new file mode 100644
index 00000000000..fb3a0deb5ef
--- /dev/null
+++ b/gcc/testsuite/g++.dg/gomp/attrs-declare-mapper-6.C
@@ -0,0 +1,22 @@ 
+/* { dg-do compile { target c++11 } } */
+
+int x = 5;
+
+struct Q {
+  int *arr1;
+  int *arr2;
+  int *arr3;
+};
+
+[[omp::directive (declare mapper (struct Q myq) map(myq.arr2[0:x]))]];
+
+struct R {
+  int *arr1;
+  int *arr2;
+  int *arr3;
+};
+
+[[omp::directive (declare mapper (struct R myr) map(myr.arr3[0:y]))]];
+/* { dg-error "'y' was not declared in this scope" "" { target c++ } .-1 } */
+
+int y = 7;