Hi! I've noticed I have missed diagnostics for invalid aligned clause arguments (the aligned clause support has been written before the restrictions were added to the standard).
Tested on x86_64-linux, committed to trunk. 2013-10-31 Jakub Jelinek <ja...@redhat.com> * 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. --- gcc/c/c-typeck.c.jj 2013-10-30 08:15:33.000000000 +0100 +++ gcc/c/c-typeck.c 2013-10-31 17:06:51.085755997 +0100 @@ -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), --- gcc/cp/semantics.c.jj 2013-10-31 14:50:29.000000000 +0100 +++ gcc/cp/semantics.c 2013-10-31 17:08:00.527394011 +0100 @@ -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); --- gcc/testsuite/g++.dg/gomp/simd-1.C.jj 2013-10-31 19:23:29.394801317 +0100 +++ gcc/testsuite/g++.dg/gomp/simd-1.C 2013-10-31 19:25:25.218210869 +0100 @@ -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]++; +} --- gcc/testsuite/g++.dg/gomp/declare-simd-1.C.jj 2013-10-11 11:23:59.000000000 +0200 +++ gcc/testsuite/g++.dg/gomp/declare-simd-1.C 2013-10-31 19:27:32.158559550 +0100 @@ -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); }; --- gcc/testsuite/g++.dg/gomp/declare-simd-2.C.jj 2013-10-11 11:23:59.000000000 +0200 +++ gcc/testsuite/g++.dg/gomp/declare-simd-2.C 2013-10-31 19:31:36.812309117 +0100 @@ -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 } --- gcc/testsuite/gcc.dg/gomp/declare-simd-2.c.jj 2013-10-11 11:23:59.000000000 +0200 +++ gcc/testsuite/gcc.dg/gomp/declare-simd-2.c 2013-10-31 19:32:59.044886760 +0100 @@ -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); --- gcc/testsuite/c-c++-common/gomp/simd6.c.jj 2013-10-31 17:32:56.000000000 +0100 +++ gcc/testsuite/c-c++-common/gomp/simd6.c 2013-10-31 17:52:27.587792500 +0100 @@ -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]++; +} Jakub