Hi!

linear clause is allowed on omp for, but the IV can only be private or
lastprivate, not linear.  We weren't diagnosing this.
Fixed thusly, regtested on x86_64-linux.

2015-10-26  Jakub Jelinek  <ja...@redhat.com>

        * gimplify.c (omp_is_private): Diagnose linear iteration variables
        on non-simd constructs.

        * gcc.dg/gomp/linear-1.c: New test.
        * g++.dg/gomp/linear-2.C: New test.

--- gcc/gimplify.c.jj   2015-10-26 15:38:20.000000000 +0100
+++ gcc/gimplify.c      2015-10-26 18:25:58.860633072 +0100
@@ -6090,6 +6090,9 @@ omp_is_private (struct gimplify_omp_ctx
          else if ((n->value & GOVD_REDUCTION) != 0)
            error ("iteration variable %qE should not be reduction",
                   DECL_NAME (decl));
+         else if (simd == 0 && (n->value & GOVD_LINEAR) != 0)
+           error ("iteration variable %qE should not be linear",
+                  DECL_NAME (decl));
          else if (simd == 1 && (n->value & GOVD_LASTPRIVATE) != 0)
            error ("iteration variable %qE should not be lastprivate",
                   DECL_NAME (decl));
--- gcc/testsuite/gcc.dg/gomp/linear-1.c.jj     2015-10-26 18:32:57.721611756 
+0100
+++ gcc/testsuite/gcc.dg/gomp/linear-1.c        2015-10-26 18:36:53.373224158 
+0100
@@ -0,0 +1,57 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp" } */
+
+int i, j;
+
+void
+f1 (void)
+{
+  #pragma omp for linear (i:1) /* { dg-error "iteration variable .i. should 
not be linear" } */
+  for (i = 0; i < 32; i++)
+    ;
+}
+
+void
+f2 (void)
+{
+  #pragma omp distribute parallel for linear (i:1)     /* { dg-error ".linear. 
is not valid for .#pragma omp distribute parallel for." } */
+  for (i = 0; i < 32; i++)
+    ;
+}
+
+void
+f3 (void)
+{
+  #pragma omp parallel for linear (i:1) collapse(1)    /* { dg-error 
"iteration variable .i. should not be linear" } */
+  for (i = 0; i < 32; i++)
+    ;
+}
+
+void
+f4 (void)
+{
+  #pragma omp for linear (i:1) linear (j:2) collapse(2)        /* { dg-error 
"iteration variable .i. should not be linear" } */
+  for (i = 0; i < 32; i++)                             /* { dg-error 
"iteration variable .j. should not be linear" "" { target *-*-* } 33 } */
+    for (j = 0; j < 32; j+=2)
+      ;
+}
+
+void
+f5 (void)
+{
+  #pragma omp target teams distribute parallel for linear (i:1) linear (j:2) 
collapse(2)       /* { dg-error ".linear. is not valid for .#pragma omp target 
teams distribute parallel for." } */
+  for (i = 0; i < 32; i++)
+    for (j = 0; j < 32; j+=2)
+      ;
+}
+
+void
+f6 (void)
+{
+  #pragma omp parallel for linear (i:1) collapse(2) linear (j:2)       /* { 
dg-error "iteration variable .i. should not be linear" } */
+  for (i = 0; i < 32; i++)                                             /* { 
dg-error "iteration variable .j. should not be linear" "" { target *-*-* } 51 } 
*/
+    for (j = 0; j < 32; j+=2)
+      ;
+}
+
+#pragma omp declare target to (i, j, f2)
--- gcc/testsuite/g++.dg/gomp/linear-2.C.jj     2015-10-26 18:33:32.352113927 
+0100
+++ gcc/testsuite/g++.dg/gomp/linear-2.C        2015-10-26 18:54:30.869022177 
+0100
@@ -0,0 +1,128 @@
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+#pragma omp declare target
+
+int i, j;
+
+void
+f1 ()
+{
+  #pragma omp for linear (i:1) // { dg-error "iteration variable .i. should 
not be linear" }
+  for (i = 0; i < 32; i++)
+    ;
+}
+
+void
+f2 ()
+{
+  #pragma omp distribute parallel for linear (i:1)     // { dg-error ".linear. 
is not valid for .#pragma omp distribute parallel for." }
+  for (i = 0; i < 32; i++)
+    ;
+}
+
+void
+f3 ()
+{
+  #pragma omp parallel for linear (i:1) collapse(1)
+  for (i = 0; i < 32; i++)                             // { dg-error 
"iteration variable .i. should not be linear" }
+    ;
+}
+
+void
+f4 ()
+{
+  #pragma omp for linear (i:1) linear (j:2) collapse(2)        // { dg-error 
"iteration variable .i. should not be linear" }
+  for (i = 0; i < 32; i++)                             // { dg-error 
"iteration variable .j. should not be linear" "" { target *-*-* } 35 }
+    for (j = 0; j < 32; j+=2)
+      ;
+}
+
+void
+f5 ()
+{
+  #pragma omp target teams distribute parallel for linear (i:1) linear (j:2) 
collapse(2)       // { dg-error ".linear. is not valid for .#pragma omp target 
teams distribute parallel for." }
+  for (i = 0; i < 32; i++)
+    for (j = 0; j < 32; j+=2)
+      ;
+}
+
+void
+f6 ()
+{
+  #pragma omp parallel for linear (i:1) collapse(2) linear (j:2)       // { 
dg-error "iteration variable .i. should not be linear" "" { target *-*-* } 54 }
+  for (i = 0; i < 32; i++)                                             // { 
dg-error "iteration variable .j. should not be linear" }
+    for (j = 0; j < 32; j+=2)
+      ;
+}
+
+template <int N>
+void
+f7 ()
+{
+  #pragma omp for linear (i:1) // { dg-error "iteration variable .i. should 
not be linear" }
+  for (i = 0; i < 32; i++)
+    ;
+}
+
+template <int N>
+void
+f8 ()
+{
+  #pragma omp distribute parallel for linear (i:1)     // { dg-error ".linear. 
is not valid for .#pragma omp distribute parallel for." }
+  for (i = 0; i < 32; i++)
+    ;
+}
+
+template <int N>
+void
+f9 ()
+{
+  #pragma omp parallel for linear (i:1) collapse(1)
+  for (i = 0; i < 32; i++)                             // { dg-error 
"iteration variable .i. should not be linear" }
+    ;
+}
+
+template <int N>
+void
+f10 ()
+{
+  #pragma omp for linear (i:1) linear (j:2) collapse(2)        // { dg-error 
"iteration variable .i. should not be linear" }
+  for (i = 0; i < 32; i++)                             // { dg-error 
"iteration variable .j. should not be linear" "" { target *-*-* } 90 }
+    for (j = 0; j < 32; j+=2)
+      ;
+}
+
+template <int N>
+void
+f11 ()
+{
+  #pragma omp target teams distribute parallel for linear (i:1) linear (j:2) 
collapse(2)       // { dg-error ".linear. is not valid for .#pragma omp target 
teams distribute parallel for." }
+  for (i = 0; i < 32; i++)
+    for (j = 0; j < 32; j+=2)
+      ;
+}
+
+template <int N>
+void
+f12 ()
+{
+  #pragma omp parallel for linear (i:1) collapse(2) linear (j:2)       // { 
dg-error "iteration variable .i. should not be linear" "" { target *-*-* } 111 }
+  for (i = 0; i < 32; i++)                                             // { 
dg-error "iteration variable .j. should not be linear" }
+    for (j = 0; j < 32; j+=2)
+      ;
+}
+
+#pragma omp end declare target
+
+void
+f13 ()
+{
+  f7 <0> ();
+  #pragma omp target teams
+  f8 <1> ();
+  f9 <2> ();
+  f10 <3> ();
+  f11 <4> ();
+  f12 <5> ();
+}

        Jakub

Reply via email to