diff options
Diffstat (limited to 'gcc/fortran/openmp.cc')
-rw-r--r-- | gcc/fortran/openmp.cc | 35 |
1 files changed, 26 insertions, 9 deletions
diff --git a/gcc/fortran/openmp.cc b/gcc/fortran/openmp.cc index b8b6686..86e4515 100644 --- a/gcc/fortran/openmp.cc +++ b/gcc/fortran/openmp.cc @@ -9067,17 +9067,34 @@ gfc_resolve_omp_do_blocks (gfc_code *code, gfc_namespace *ns) if (code->ext.omp_clauses->sched_kind != OMP_SCHED_NONE) gfc_error ("SCHEDULE clause specified together with %<inscan%> " "REDUCTION clause at %L", loc); - if (!c->block - || !c->block->next - || !c->block->next->next - || c->block->next->next->op != EXEC_OMP_SCAN - || !c->block->next->next->next - || c->block->next->next->next->next) + gfc_code *block = c->block ? c->block->next : NULL; + if (block && block->op != EXEC_OMP_SCAN) + while (block && block->next && block->next->op != EXEC_OMP_SCAN) + block = block->next; + if (!block + || (block->op != EXEC_OMP_SCAN + && (!block->next || block->next->op != EXEC_OMP_SCAN))) gfc_error ("With INSCAN at %L, expected loop body with !$OMP SCAN " - "between two structured-block-sequences", loc); + "between two structured block sequences", loc); else - /* Mark as checked; flag will be unset later. */ - c->block->next->next->ext.omp_clauses->if_present = true; + { + if (block->op == EXEC_OMP_SCAN) + gfc_warning (0, "!$OMP SCAN at %L with zero executable " + "statements in preceding structured block " + "sequence", &block->loc); + if ((block->op == EXEC_OMP_SCAN && !block->next) + || (block->next && block->next->op == EXEC_OMP_SCAN + && !block->next->next)) + gfc_warning (0, "!$OMP SCAN at %L with zero executable " + "statements in succeeding structured block " + "sequence", block->op == EXEC_OMP_SCAN + ? &block->loc : &block->next->loc); + } + if (block && block->op != EXEC_OMP_SCAN) + block = block->next; + if (block && block->op == EXEC_OMP_SCAN) + /* Mark 'omp scan' as checked; flag will be unset later. */ + block->ext.omp_clauses->if_present = true; } } gfc_resolve_blocks (code->block, ns); |