@@ -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),
@@ -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);
@@ -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]++;
+}
@@ -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);
};
@@ -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 }
@@ -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);
@@ -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]++;
+}