diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 14eba5d69a2..177cda85570 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2014-03-07 Thomas Schwinge + + * langhooks.c (lhd_omp_mappable_type): The error_mark_node is not + an OpenMP mappable type. + 2014-03-06 Matthias Klose * Makefile.in (s-mlib): Only pass MULTIARCH_DIRNAME if diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index e9d25d5b866..9d854a7feb6 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,9 @@ +2014-03-07 Thomas Schwinge + + * c-decl.c (c_decl_attributes): Use + lang_hooks.types.omp_mappable_type. + * c-typeck.c (c_finish_omp_clauses): Likewise. + 2014-03-06 Marek Polacek PR c/60197 diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c index 7a7d68edf95..2c41bf2ce92 100644 --- a/gcc/c/c-decl.c +++ b/gcc/c/c-decl.c @@ -4024,7 +4024,7 @@ c_decl_attributes (tree *node, tree attributes, int flags) error ("%q+D in block scope inside of declare target directive", *node); else if (TREE_CODE (*node) == VAR_DECL - && !COMPLETE_TYPE_P (TREE_TYPE (*node))) + && !lang_hooks.types.omp_mappable_type (TREE_TYPE (*node))) error ("%q+D in declare target directive does not have mappable type", *node); else diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c index 7c4ba0eb225..524a59f12e2 100644 --- a/gcc/c/c-typeck.c +++ b/gcc/c/c-typeck.c @@ -12032,7 +12032,7 @@ c_finish_omp_clauses (tree clauses) else { t = OMP_CLAUSE_DECL (c); - if (!COMPLETE_TYPE_P (TREE_TYPE (t))) + if (!lang_hooks.types.omp_mappable_type (TREE_TYPE (t))) { error_at (OMP_CLAUSE_LOCATION (c), "array section does not have mappable type " @@ -12061,9 +12061,9 @@ c_finish_omp_clauses (tree clauses) } else if (!c_mark_addressable (t)) remove = true; - else if (!COMPLETE_TYPE_P (TREE_TYPE (t)) - && !(OMP_CLAUSE_CODE (c) == OMP_CLAUSE_MAP - && OMP_CLAUSE_MAP_KIND (c) == OMP_CLAUSE_MAP_POINTER)) + else if (!(OMP_CLAUSE_CODE (c) == OMP_CLAUSE_MAP + && OMP_CLAUSE_MAP_KIND (c) == OMP_CLAUSE_MAP_POINTER) + && !lang_hooks.types.omp_mappable_type (TREE_TYPE (t))) { error_at (OMP_CLAUSE_LOCATION (c), "%qD does not have a mappable type in %qs clause", t, diff --git a/gcc/langhooks.c b/gcc/langhooks.c index eca0299584f..d00ebd8a08c 100644 --- a/gcc/langhooks.c +++ b/gcc/langhooks.c @@ -524,13 +524,15 @@ lhd_omp_firstprivatize_type_sizes (struct gimplify_omp_ctx *c ATTRIBUTE_UNUSED, { } -/* Return true if TYPE is an OpenMP mappable type. By default return true - if type is complete. */ +/* Return true if TYPE is an OpenMP mappable type. */ bool lhd_omp_mappable_type (tree type) { - return COMPLETE_TYPE_P (type); + /* Mappable type has to be complete. */ + if (type == error_mark_node || !COMPLETE_TYPE_P (type)) + return false; + return true; } /* Common function for add_builtin_function and diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fe4a19b86dc..642abab5f2a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2014-03-07 Thomas Schwinge + + * c-c++-common/gomp/map-1.c: Extend. + 2014-03-06 Paul Thomas Janus Weil diff --git a/gcc/testsuite/c-c++-common/gomp/map-1.c b/gcc/testsuite/c-c++-common/gomp/map-1.c index 694d88cc795..5dad7d6a9aa 100644 --- a/gcc/testsuite/c-c++-common/gomp/map-1.c +++ b/gcc/testsuite/c-c++-common/gomp/map-1.c @@ -8,6 +8,8 @@ int k[10], l[10], m[10], n[10], o; int *p; int **q; int r[4][4][4][4][4]; +extern struct s s1; +extern struct s s2[1]; /* { dg-error "array type has incomplete element type" "" { target c } } */ int t[10]; #pragma omp threadprivate (t) #pragma omp declare target @@ -32,6 +34,10 @@ foo (int g[3][10], int h[4][8], int i[2][10], int j[][9], ; #pragma omp target map(to: o[2:5]) /* { dg-error "does not have pointer or array type" } */ ; + #pragma omp target map(alloc: s1) /* { dg-error "'s1' does not have a mappable type in 'map' clause" } */ + ; + #pragma omp target map(alloc: s2) /* { dg-error "'s2' does not have a mappable type in 'map' clause" } */ + ; #pragma omp target map(to: a[:][:]) /* { dg-error "array type length expression must be specified" } */ bar (&a[0][0]); /* { dg-error "referenced in target region does not have a mappable type" } */ #pragma omp target map(tofrom: b[-1:]) /* { dg-error "negative low bound in array section" } */