On Thu, Nov 11, 2021 at 06:11:23PM +0100, Tobias Burnus wrote: > --- a/gcc/fortran/parse.c > +++ b/gcc/fortran/parse.c > @@ -915,15 +915,16 @@ decode_omp_directive (void) > matcho ("error", gfc_match_omp_error, ST_OMP_ERROR); > matcho ("end atomic", gfc_match_omp_eos_error, ST_OMP_END_ATOMIC); > matcho ("end critical", gfc_match_omp_end_critical, > ST_OMP_END_CRITICAL); > - matchs ("end distribute parallel do simd", gfc_match_omp_eos_error, > + matchs ("end distribute parallel do simd", gfc_match_omp_end_nowait, > ST_OMP_END_DISTRIBUTE_PARALLEL_DO_SIMD); > - matcho ("end distribute parallel do", gfc_match_omp_eos_error, > + matcho ("end distribute parallel do", gfc_match_omp_end_nowait,
I think the above two changes are incorrect. At least looking at 5.1 which is clearer than 5.2, 5.1 [221:17-23] says for C/C++ that while nowait is allowed on worksharing-loop, it is not allowed on combined parallel worksharing-loop, and Fortran has that restriction through the syntax (no [nowait] on !$omp end parallel do). > @@ -936,9 +937,12 @@ decode_omp_directive (void) > ST_OMP_END_MASTER_TASKLOOP); > matcho ("end master", gfc_match_omp_eos_error, ST_OMP_END_MASTER); > matchs ("end ordered", gfc_match_omp_eos_error, ST_OMP_END_ORDERED); > - matchs ("end parallel do simd", gfc_match_omp_eos_error, > + matchs ("end parallel do simd", gfc_match_omp_end_nowait, > ST_OMP_END_PARALLEL_DO_SIMD); > - matcho ("end parallel do", gfc_match_omp_eos_error, > ST_OMP_END_PARALLEL_DO); > + matcho ("end parallel do", gfc_match_omp_end_nowait, > + ST_OMP_END_PARALLEL_DO); Likewise for the above two. > @@ -951,46 +955,53 @@ decode_omp_directive (void) > ST_OMP_END_PARALLEL_MASTER_TASKLOOP); > matcho ("end parallel master", gfc_match_omp_eos_error, > ST_OMP_END_PARALLEL_MASTER); > - matcho ("end parallel sections", gfc_match_omp_eos_error, > + matcho ("end parallel sections", gfc_match_omp_end_nowait, > ST_OMP_END_PARALLEL_SECTIONS); > - matcho ("end parallel workshare", gfc_match_omp_eos_error, > + matcho ("end parallel workshare", gfc_match_omp_end_nowait, > ST_OMP_END_PARALLEL_WORKSHARE); Ditto for the above two. > matcho ("end parallel", gfc_match_omp_eos_error, ST_OMP_END_PARALLEL); > matcho ("end scope", gfc_match_omp_end_nowait, ST_OMP_END_SCOPE); > matcho ("end sections", gfc_match_omp_end_nowait, ST_OMP_END_SECTIONS); > matcho ("end single", gfc_match_omp_end_single, ST_OMP_END_SINGLE); > matcho ("end target data", gfc_match_omp_eos_error, > ST_OMP_END_TARGET_DATA); > - matchs ("end target parallel do simd", gfc_match_omp_eos_error, > + matchs ("end target parallel do simd", gfc_match_omp_end_nowait, The above seems like a bug in 5.1 standard, haven't checked 5.2. !$omp end target parallel do simd nowait should be IMO valid, but [241:16] mistakenly doesn't list it. > ST_OMP_END_TARGET_PARALLEL_DO_SIMD); > - matcho ("end target parallel do", gfc_match_omp_eos_error, > + matcho ("end target parallel do", gfc_match_omp_end_nowait, Similarly. > ST_OMP_END_TARGET_PARALLEL_DO); > - matcho ("end target parallel", gfc_match_omp_eos_error, > + matcho ("end target parallel loop", gfc_match_omp_end_nowait, > + ST_OMP_END_TARGET_PARALLEL_LOOP); Similarly. > + matcho ("end target parallel", gfc_match_omp_end_nowait, > ST_OMP_END_TARGET_PARALLEL); Similarly. > - matchs ("end target simd", gfc_match_omp_eos_error, > ST_OMP_END_TARGET_SIMD); > + matchs ("end target simd", gfc_match_omp_end_nowait, > ST_OMP_END_TARGET_SIMD); Similarly. > matchs ("end target teams distribute parallel do simd", > - gfc_match_omp_eos_error, > + gfc_match_omp_end_nowait, > ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD); > - matcho ("end target teams distribute parallel do", > gfc_match_omp_eos_error, > + matcho ("end target teams distribute parallel do", > + gfc_match_omp_end_nowait, > ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO); > - matchs ("end target teams distribute simd", gfc_match_omp_eos_error, > + matchs ("end target teams distribute simd", gfc_match_omp_end_nowait, > ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_SIMD); > - matcho ("end target teams distribute", gfc_match_omp_eos_error, > + matcho ("end target teams distribute", gfc_match_omp_end_nowait, > ST_OMP_END_TARGET_TEAMS_DISTRIBUTE); > - matcho ("end target teams", gfc_match_omp_eos_error, > ST_OMP_END_TARGET_TEAMS); > - matcho ("end target", gfc_match_omp_eos_error, ST_OMP_END_TARGET); > + matcho ("end target teams loop", gfc_match_omp_end_nowait, > + ST_OMP_END_TARGET_TEAMS_LOOP); > + matcho ("end target teams", gfc_match_omp_end_nowait, > + ST_OMP_END_TARGET_TEAMS); > + matcho ("end target", gfc_match_omp_end_nowait, ST_OMP_END_TARGET); Similarly all the above. !$omp end target followed by anything should accept nowait. > matcho ("end taskgroup", gfc_match_omp_eos_error, > ST_OMP_END_TASKGROUP); > matchs ("end taskloop simd", gfc_match_omp_eos_error, > ST_OMP_END_TASKLOOP_SIMD); > matcho ("end taskloop", gfc_match_omp_eos_error, ST_OMP_END_TASKLOOP); > matcho ("end task", gfc_match_omp_eos_error, ST_OMP_END_TASK); > - matchs ("end teams distribute parallel do simd", > gfc_match_omp_eos_error, > + matchs ("end teams distribute parallel do simd", > gfc_match_omp_end_nowait, > ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD); > - matcho ("end teams distribute parallel do", gfc_match_omp_eos_error, > + matcho ("end teams distribute parallel do", gfc_match_omp_end_nowait, These again shouldn't allow nowait, the outermost leaf construct that accepts nowait is do and when do is combined with parallel, nowait shouldn't be specified. Jakub