aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/openmp.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/fortran/openmp.cc')
-rw-r--r--gcc/fortran/openmp.cc34
1 files changed, 23 insertions, 11 deletions
diff --git a/gcc/fortran/openmp.cc b/gcc/fortran/openmp.cc
index 19142c4..16cd03a 100644
--- a/gcc/fortran/openmp.cc
+++ b/gcc/fortran/openmp.cc
@@ -531,14 +531,6 @@ gfc_match_omp_detach (gfc_expr **expr)
if (gfc_match_variable (expr, 0) != MATCH_YES)
goto syntax_error;
- if ((*expr)->ts.type != BT_INTEGER || (*expr)->ts.kind != gfc_c_intptr_kind)
- {
- gfc_error ("%qs at %L should be of type "
- "integer(kind=omp_event_handle_kind)",
- (*expr)->symtree->n.sym->name, &(*expr)->where);
- return MATCH_ERROR;
- }
-
if (gfc_match_char (')') != MATCH_YES)
goto syntax_error;
@@ -7581,9 +7573,29 @@ resolve_omp_clauses (gfc_code *code, gfc_omp_clauses *omp_clauses,
gfc_error ("%s must contain at least one MAP clause at %L",
p, &code->loc);
}
- if (!openacc && omp_clauses->mergeable && omp_clauses->detach)
- gfc_error ("%<DETACH%> clause at %L must not be used together with "
- "%<MERGEABLE%> clause", &omp_clauses->detach->where);
+
+ if (!openacc && omp_clauses->detach)
+ {
+ if (!gfc_resolve_expr (omp_clauses->detach)
+ || omp_clauses->detach->ts.type != BT_INTEGER
+ || omp_clauses->detach->ts.kind != gfc_c_intptr_kind
+ || omp_clauses->detach->rank != 0)
+ gfc_error ("%qs at %L should be a scalar of type "
+ "integer(kind=omp_event_handle_kind)",
+ omp_clauses->detach->symtree->n.sym->name,
+ &omp_clauses->detach->where);
+ else if (omp_clauses->detach->symtree->n.sym->attr.dimension > 0)
+ gfc_error ("The event handle at %L must not be an array element",
+ &omp_clauses->detach->where);
+ else if (omp_clauses->detach->symtree->n.sym->ts.type == BT_DERIVED
+ || omp_clauses->detach->symtree->n.sym->ts.type == BT_CLASS)
+ gfc_error ("The event handle at %L must not be part of "
+ "a derived type or class", &omp_clauses->detach->where);
+
+ if (omp_clauses->mergeable)
+ gfc_error ("%<DETACH%> clause at %L must not be used together with "
+ "%<MERGEABLE%> clause", &omp_clauses->detach->where);
+ }
}