c-typeck.c (c_finish_omp_clauses): Diagnose aligned clause with decl that is not...
authorJakub Jelinek <jakub@redhat.com>
Thu, 31 Oct 2013 19:06:08 +0000 (20:06 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 31 Oct 2013 19:06:08 +0000 (20:06 +0100)
* c-typeck.c (c_finish_omp_clauses): Diagnose aligned clause
with decl that is not pointer nor array.

* semantics.c (finish_omp_clauses): Diagnose aligned clause
with decl that is not pointer nor array nor reference to those.

* g++.dg/gomp/simd-1.C: New test.
* g++.dg/gomp/declare-simd-1.C (f32): Fix up aligned clause argument.
* g++.dg/gomp/declare-simd-2.C (fn13, fn14): Add new tests.
* gcc.dg/gomp/declare-simd-2.c (fn7, fn8, fn9, fn10, fn11): Likewise.
* c-c++-common/gomp/simd6.c: New test.

From-SVN: r204273

gcc/c/ChangeLog
gcc/c/c-typeck.c
gcc/cp/ChangeLog
gcc/cp/semantics.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/gomp/simd6.c [new file with mode: 0644]
gcc/testsuite/g++.dg/gomp/declare-simd-1.C
gcc/testsuite/g++.dg/gomp/declare-simd-2.C
gcc/testsuite/g++.dg/gomp/simd-1.C [new file with mode: 0644]
gcc/testsuite/gcc.dg/gomp/declare-simd-2.c

index ed60988a150dbcb11d312d0017f7b1da14b3c957..8f8a245edcf5c6130af8b7857570421aae2b1f50 100644 (file)
@@ -1,3 +1,8 @@
+2013-10-31  Jakub Jelinek  <jakub@redhat.com>
+
+       * c-typeck.c (c_finish_omp_clauses): Diagnose aligned clause
+       with decl that is not pointer nor array.
+
 2013-10-29  Balaji V. Iyer  <balaji.v.iyer@intel.com>
 
        * c-decl.c (finish_function): Added a call for insert_cilk_frame when
index 1034cee1fcce50d4cae82e812a466ed91eab3452..5a23c843295616f8a7b39586e1056cd4b0371492 100644 (file)
@@ -11504,6 +11504,14 @@ c_finish_omp_clauses (tree clauses)
                        "%qE is not a variable in %<aligned%> clause", t);
              remove = true;
            }
+         else if (!POINTER_TYPE_P (TREE_TYPE (t))
+                  && TREE_CODE (TREE_TYPE (t)) != ARRAY_TYPE)
+           {
+             error_at (OMP_CLAUSE_LOCATION (c),
+                       "%qE in %<aligned%> clause is neither a pointer nor "
+                       "an array", t);
+             remove = true;
+           }
          else if (bitmap_bit_p (&aligned_head, DECL_UID (t)))
            {
              error_at (OMP_CLAUSE_LOCATION (c),
index c7a0e5d9dc98de1c5a112653850f2eab2fd958f4..e7b1e254318559c1da67319ab6d844e3a61a9b7f 100644 (file)
@@ -1,3 +1,8 @@
+2013-10-31  Jakub Jelinek  <jakub@redhat.com>
+
+       * semantics.c (finish_omp_clauses): Diagnose aligned clause
+       with decl that is not pointer nor array nor reference to those.
+
 2013-10-31  Jason Merrill  <jason@redhat.com>
 
        * semantics.c (cxx_eval_call_expression): Handle trivial
index de3e8e7dcb895554cb333b99ff6321864cbcac0c..49097f7f1b33e122e921083fccb3e38413c5bbba 100644 (file)
@@ -5467,6 +5467,19 @@ finish_omp_clauses (tree clauses)
                error ("%qE is not a variable in %<aligned%> clause", t);
              remove = true;
            }
+         else if (!type_dependent_expression_p (t)
+                  && TREE_CODE (TREE_TYPE (t)) != POINTER_TYPE
+                  && TREE_CODE (TREE_TYPE (t)) != ARRAY_TYPE
+                  && (TREE_CODE (TREE_TYPE (t)) != REFERENCE_TYPE
+                      || (!POINTER_TYPE_P (TREE_TYPE (TREE_TYPE (t)))
+                          && (TREE_CODE (TREE_TYPE (TREE_TYPE (t)))
+                              != ARRAY_TYPE))))
+           {
+             error_at (OMP_CLAUSE_LOCATION (c),
+                       "%qE in %<aligned%> clause is neither a pointer nor "
+                       "an array nor a reference to pointer or array", t);
+             remove = true;
+           }
          else if (bitmap_bit_p (&aligned_head, DECL_UID (t)))
            {
              error ("%qD appears more than once in %<aligned%> clauses", t);
index 68f93f4e027199208c5e076b593407d58b0158b3..b231dc89ebde047412e7dd0ace8983f3d7fa6e06 100644 (file)
@@ -1,3 +1,11 @@
+2013-10-31  Jakub Jelinek  <jakub@redhat.com>
+
+       * g++.dg/gomp/simd-1.C: New test.
+       * g++.dg/gomp/declare-simd-1.C (f32): Fix up aligned clause argument.
+       * g++.dg/gomp/declare-simd-2.C (fn13, fn14): Add new tests.
+       * gcc.dg/gomp/declare-simd-2.c (fn7, fn8, fn9, fn10, fn11): Likewise.
+       * c-c++-common/gomp/simd6.c: New test.
+
 2013-10-31  Edward Smith-Rowland  <3dw4rd@verizon.net>
 
        Implement C++14 digit separators.
diff --git a/gcc/testsuite/c-c++-common/gomp/simd6.c b/gcc/testsuite/c-c++-common/gomp/simd6.c
new file mode 100644 (file)
index 0000000..3a90c22
--- /dev/null
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp" } */
+
+extern int a[1024];
+
+struct S { int i; } s;
+
+void
+f1 (int x, float f, int *p)
+{
+  int i;
+  #pragma omp simd aligned(x : 32)     /* { dg-error "neither a pointer nor an array" } */
+  for (i = 0; i < 1024; i++)
+    a[i]++;
+  #pragma omp simd aligned(f)          /* { dg-error "neither a pointer nor an array" } */
+  for (i = 0; i < 1024; i++)
+    a[i]++;
+  #pragma omp simd aligned(s : 16)     /* { dg-error "neither a pointer nor an array" } */
+  for (i = 0; i < 1024; i++)
+    a[i]++;
+  #pragma omp simd aligned(a : 8)
+  for (i = 0; i < 1024; i++)
+    a[i]++;
+  #pragma omp simd aligned(p : 8)
+  for (i = 0; i < 1024; i++)
+    a[i]++;
+}
index 1fd88b7efab5bd2a59c1b36c96d1fc57ae473d6e..e9be161948e10812d438afc5371ff522fd382dd4 100644 (file)
@@ -205,7 +205,7 @@ f30 (int x)
 template <int N>
 struct C
 {
-  #pragma omp declare simd simdlen (N) aligned (a : N * sizeof (int)) linear (c : N) notinbranch
+  #pragma omp declare simd simdlen (N) aligned (b : N * sizeof (int)) linear (c : N) notinbranch
   int f32 (int a, int *b, int c);
 };
 
index f64004fb012a03911c8e3bbc1e2f522630d848a2..e450a0241c75910a5521bca69539e65e6a2005a2 100644 (file)
@@ -64,4 +64,22 @@ struct D
   int e;
 };
 
+#pragma omp declare simd aligned (a, b, c, d)
+int fn13 (int *a, int b[64], int *&c, int (&d)[64]);
+
+#pragma omp declare simd aligned (a)   // { dg-error "neither a pointer nor an array" }
+int fn14 (int a);
+
+#pragma omp declare simd aligned (b)   // { dg-error "neither a pointer nor an array" }
+int fn14 (int &b);
+
+#pragma omp declare simd aligned (c)   // { dg-error "neither a pointer nor an array" }
+int fn14 (float c);
+
+#pragma omp declare simd aligned (d)   // { dg-error "neither a pointer nor an array" }
+int fn14 (double &d);
+
+#pragma omp declare simd aligned (e)   // { dg-error "neither a pointer nor an array" }
+int fn14 (D e);
+
 // { dg-error "has no member" "" { target *-*-* } 61 }
diff --git a/gcc/testsuite/g++.dg/gomp/simd-1.C b/gcc/testsuite/g++.dg/gomp/simd-1.C
new file mode 100644 (file)
index 0000000..c9c2e73
--- /dev/null
@@ -0,0 +1,31 @@
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+extern int a[1024];
+int (&b)[1024] = a;
+
+struct S { int s; } s, &t = s;
+
+void
+f1 (int &x, float &f, int *&p)
+{
+  int i;
+  #pragma omp simd aligned(x : 32)     // { dg-error "neither a pointer nor an array" }
+  for (i = 0; i < 1024; i++)
+    a[i]++;
+  #pragma omp simd aligned(f)          // { dg-error "neither a pointer nor an array" }
+  for (i = 0; i < 1024; i++)
+    a[i]++;
+  #pragma omp simd aligned(t : 16)     // { dg-error "neither a pointer nor an array" }
+  for (i = 0; i < 1024; i++)
+    a[i]++;
+  #pragma omp simd aligned(a : 8)
+  for (i = 0; i < 1024; i++)
+    a[i]++;
+  #pragma omp simd aligned(b : 8)
+  for (i = 0; i < 1024; i++)
+    b[i]++;
+  #pragma omp simd aligned(p : 8)
+  for (i = 0; i < 1024; i++)
+    a[i]++;
+}
index 118549be908dc63fb6a4e5bb79fc9b2482999dd2..6c7de8b73f9f612e6fde900958f218006ac79301 100644 (file)
@@ -22,3 +22,20 @@ int fn5 (int a);
 
 #pragma omp declare simd inbranch notinbranch /* { dg-error "clause is incompatible with" } */
 int fn6 (int);
+
+#pragma omp declare simd aligned (a, b)
+int fn7 (int *a, int b[64]);
+
+#pragma omp declare simd aligned (a)    /* { dg-error "neither a pointer nor an array" } */
+int fn8 (int a);
+
+#pragma omp declare simd aligned (c)    /* { dg-error "neither a pointer nor an array" } */
+int fn9 (float c);
+
+#pragma omp declare simd aligned (d)    /* { dg-error "neither a pointer nor an array" } */
+int fn10 (double d);
+
+struct D { int d; };
+
+#pragma omp declare simd aligned (e)    /* { dg-error "neither a pointer nor an array" } */
+int fn11 (struct D e);