On Tue, Dec 08, 2020 at 01:13:07PM +0100, Tobias Burnus wrote:
> +             if (list == OMP_LIST_REDUCTION)
> +               has_inscan = true;

This looks weird, I would have expected
if (list == OMP_LIST_REDUCTION_INSCAN)

> @@ -6151,6 +6203,28 @@ gfc_resolve_omp_do_blocks (gfc_code *code, 
> gfc_namespace *ns)
>       }
>        if (i < omp_current_do_collapse || omp_current_do_collapse <= 0)
>       omp_current_do_collapse = 1;
> +      if (code->ext.omp_clauses->lists[OMP_LIST_REDUCTION_INSCAN])
> +     {
> +       locus *loc
> +         = &code->ext.omp_clauses->lists[OMP_LIST_REDUCTION_INSCAN]->where;
> +       if (code->ext.omp_clauses->ordered)
> +         gfc_error ("ORDERED clause specified together with %<inscan%> "
> +                    "REDUCTION clause at %L", loc);
> +       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_error ("With INSCAN at %L, expected loop body with !$OMP SCAN "
> +                    "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;
> +     }

So you initially accept !$omp scan everywhere and only later complain if it
is misplaced?  I think e.g. for !$omp section I used to hardcode it in
parse_omp_structured_block - allow it only there and nowhere else:
      else if (st == ST_OMP_SECTION
               && (omp_st == ST_OMP_SECTIONS
                   || omp_st == ST_OMP_PARALLEL_SECTIONS))

> @@ -7046,6 +7122,14 @@ gfc_resolve_omp_directive (gfc_code *code, 
> gfc_namespace *ns ATTRIBUTE_UNUSED)
>       gfc_error ("OMP CRITICAL at %L with HINT clause requires a NAME, "
>                  "except when omp_sync_hint_none is used", &code->loc);
>        break;
> +    case EXEC_OMP_SCAN:
> +      /* Flag is only used to checking, hence, it is unset afterwards.  */
> +      if (!code->ext.omp_clauses->if_present)

Isn't if_present used also for OpenACC?  Then can't it with -fopenmp
-fopenacc allow
!$acc ... if_present...
!$omp scan inclusive(...)
!$add end ...
?
> +     gfc_error ("Unexpected !$OMP SCAN at %L outside loop construct with "
> +                "%<inscan%> REDUCTION clause", &code->loc);
> +      code->ext.omp_clauses->if_present = false;
> +      resolve_omp_clauses (code, code->ext.omp_clauses, ns);
> +      break;
>      default:
>        break;
>      }

Otherwise LGTM.

        Jakub

Reply via email to