OpenMP: Improve map-clause error message for array function parameter (PR96678)
authorTobias Burnus <tobias@codesourcery.com>
Tue, 25 Aug 2020 15:46:13 +0000 (17:46 +0200)
committerTobias Burnus <tobias@codesourcery.com>
Tue, 25 Aug 2020 15:46:41 +0000 (17:46 +0200)
gcc/c/ChangeLog:

PR c/96678
* c-typeck.c (handle_omp_array_sections_1): Talk about
array function parameter in the error message.

gcc/cp/ChangeLog:

PR c/96678
* semantics.c (handle_omp_array_sections_1): Talk about
array function parameter in the error message.

gcc/testsuite/ChangeLog:

PR c/96678
* c-c++-common/gomp/map-4.c: New test.
* c-c++-common/gomp/depend-1.c: Update dg-error.
* c-c++-common/gomp/map-1.c: Likewise.
* c-c++-common/gomp/reduction-1.c: Likewise.
* g++.dg/gomp/depend-1.C: Likewise.
* g++.dg/gomp/depend-2.C: Likewise.

gcc/c/c-typeck.c
gcc/cp/semantics.c
gcc/testsuite/c-c++-common/gomp/depend-1.c
gcc/testsuite/c-c++-common/gomp/map-1.c
gcc/testsuite/c-c++-common/gomp/map-4.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/gomp/reduction-1.c
gcc/testsuite/g++.dg/gomp/depend-1.C
gcc/testsuite/g++.dg/gomp/depend-2.C

index 0d639b60ea32eb1628f64e099189d889da301087..e158d236501df9a0f6360ec64d1179f3676c91f5 100644 (file)
@@ -13298,8 +13298,13 @@ handle_omp_array_sections_1 (tree c, tree t, vec<tree> &types,
     {
       if (length == NULL_TREE)
        {
-         error_at (OMP_CLAUSE_LOCATION (c),
-                   "for pointer type length expression must be specified");
+         if (C_ARRAY_PARAMETER (ret))
+           error_at (OMP_CLAUSE_LOCATION (c),
+                     "for array function parameter length expression "
+                     "must be specified");
+         else
+           error_at (OMP_CLAUSE_LOCATION (c),
+                     "for pointer type length expression must be specified");
          return error_mark_node;
        }
       if (length != NULL_TREE
index 3877a0e536a49bca581168dd53b67a8e38a34b59..7f861fde7d6a45b815a260c1f55023a83b06f992 100644 (file)
@@ -5083,8 +5083,13 @@ handle_omp_array_sections_1 (tree c, tree t, vec<tree> &types,
     {
       if (length == NULL_TREE)
        {
-         error_at (OMP_CLAUSE_LOCATION (c),
-                   "for pointer type length expression must be specified");
+         if (DECL_ARRAY_PARAMETER_P (ret))
+           error_at (OMP_CLAUSE_LOCATION (c),
+                     "for array function parameter length expression "
+                     "must be specified");
+         else
+           error_at (OMP_CLAUSE_LOCATION (c),
+                     "for pointer type length expression must be specified");
          return error_mark_node;
        }
       if (length != NULL_TREE
index 8a5850e45fe3f2abf909cc7f33bd1f7ef6adb05b..599031f2d900264e236f3702ade0bdb7a6dc8567 100644 (file)
@@ -40,7 +40,7 @@ foo (int g[3][10], int h[4][8], int i[2][10], int j[][9],
     ;
   #pragma omp task depend(out: f[1:10]) /* { dg-error "high bound \[^\n\r]* above array section size" } */
     ;
-  #pragma omp task depend(in: g[:][2:4]) /* { dg-error "for pointer type length expression must be specified" } */
+  #pragma omp task depend(in: g[:][2:4]) /* { dg-error "for array function parameter length expression must be specified" } */
     ;
   #pragma omp task depend(in: h[2:2][-1:]) /* { dg-error "negative low bound in array section" } */
     ;
index 5dad7d6a9aa9edfed1138e00255014886398831f..508dc8d6b011abb0dd8eaa84cc94bea9ca47deb9 100644 (file)
@@ -50,7 +50,7 @@ foo (int g[3][10], int h[4][8], int i[2][10], int j[][9],
     bar (e);
   #pragma omp target map(to: f[1:10]) /* { dg-error "high bound \[^\n\r]* above array section size" } */
     bar (f);
-  #pragma omp target map(from: g[:][0:10]) /* { dg-error "for pointer type length expression must be specified" } */
+  #pragma omp target map(from: g[:][0:10]) /* { dg-error "for array function parameter length expression must be specified" } */
     bar (&g[0][0]);
   #pragma omp target map(from: h[2:1][-1:]) /* { dg-error "negative low bound in array section" } */
     bar (&h[0][0]);
diff --git a/gcc/testsuite/c-c++-common/gomp/map-4.c b/gcc/testsuite/c-c++-common/gomp/map-4.c
new file mode 100644 (file)
index 0000000..6c48636
--- /dev/null
@@ -0,0 +1,29 @@
+/* PR c/96678.  */
+
+#define SIZE   (100)
+typedef double Grid[SIZE];
+
+void test (Grid src1)
+{
+  #pragma omp target map(alloc:src1[:])  /* { dg-error "for array function parameter length expression must be specified" }  */
+  {
+    src1[0] = 5;
+  }
+}
+
+void test2 (double src2[])
+{
+  #pragma omp target map(alloc:src2[:])  /* { dg-error "for array function parameter length expression must be specified" }  */
+  {
+    src2[0] = 5;
+  }
+}
+
+void test3 (double *src3)
+{
+  #pragma omp target map(alloc:src3[:])  /* { dg-error "for pointer type length expression must be specified" }  */
+  {
+    src3[0] = 5;
+  }
+}
+
index e8dd530b1a4ec9ae65008e43c812b1452e4e0d60..897ed68e1a342f665d8a9c26eb75698eaf918421 100644 (file)
@@ -44,7 +44,7 @@ foo (int a[10][10][10], int **b, int x)
     bar (a);
   #pragma omp parallel reduction(+: f[:][0:2])         /* { dg-error "for unknown bound array type length expression must be specified" } */
     bar (a);
-  #pragma omp parallel reduction(+: a[:][0:10])                /* { dg-error "for pointer type length expression must be specified" } */
+  #pragma omp parallel reduction(+: a[:][0:10])                /* { dg-error "for array function parameter length expression must be specified" } */
     bar (a);
   #pragma omp parallel reduction(+: a[:10][0:12])      /* { dg-error "above array section size" } */
     bar (a);
index 33027de552a8609e2595213190f6191add842af8..81ae27f3ce2769fa2768e5a554ebc2380be792c0 100644 (file)
@@ -35,7 +35,7 @@ foo (int g[3][10], int h[4][8], int i[2][10], int j[][9],
     ;
   #pragma omp task depend(out: f[1:10]) // { dg-error "high bound \[^\n\r]* above array section size" }
     ;
-  #pragma omp task depend(in: g[:][2:4]) // { dg-error "for pointer type length expression must be specified" }
+  #pragma omp task depend(in: g[:][2:4]) // { dg-error "for array function parameter length expression must be specified" }
     ;
   #pragma omp task depend(out: i[:1][11:]) // { dg-error "low bound \[^\n\r]* above array section size" }
     ;
index c3f19658c5a98fda64b599d940d34279b09c2546..f0f9f60056bed7c4e5b483b565638678197ea9ee 100644 (file)
@@ -41,7 +41,7 @@ foo (int g[3][10], int h[4][8], int i[2][10], int j[][9],
     ;
   #pragma omp task depend(out: f[1:10]) // { dg-error "high bound \[^\n\r]* above array section size" }
     ;
-  #pragma omp task depend(in: g[:][2:4]) // { dg-error "for pointer type length expression must be specified" }
+  #pragma omp task depend(in: g[:][2:4]) // { dg-error "for array function parameter length expression must be specified" }
     ;
   #pragma omp task depend(in: h[2:2][-1:]) // { dg-error "negative low bound in array section" }
     ;