diff options
author | Tobias Burnus <tobias@codesourcery.com> | 2021-08-18 15:21:18 +0200 |
---|---|---|
committer | Tobias Burnus <tobias@codesourcery.com> | 2021-08-18 15:24:22 +0200 |
commit | f74433e70ae94a3b5291e45fea488b1cfdee4a34 (patch) | |
tree | 86caeb8480d332f032516f9191bdd42847a65944 | |
parent | be4a4fb516688d7cfe28a80a4aa333f4ecf0b518 (diff) | |
download | gcc-f74433e70ae94a3b5291e45fea488b1cfdee4a34.tar.gz |
Fortran: Add OpenMP's nothing directive support
Fortran version of commit 5079b7781a2c506dcdfb241347d74c7891268225
gcc/fortran/ChangeLog:
* match.h (gfc_match_omp_nothing): New.
* openmp.c (gfc_match_omp_nothing): New.
* parse.c (decode_omp_directive): Match 'nothing' directive.
gcc/testsuite/ChangeLog:
* gfortran.dg/nothing-1.f90: New test.
* gfortran.dg/nothing-2.f90: New test.
-rw-r--r-- | gcc/fortran/match.h | 1 | ||||
-rw-r--r-- | gcc/fortran/openmp.c | 11 | ||||
-rw-r--r-- | gcc/fortran/parse.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/nothing-1.f90 | 28 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/nothing-2.f90 | 7 |
5 files changed, 50 insertions, 0 deletions
diff --git a/gcc/fortran/match.h b/gcc/fortran/match.h index aac16a8d3d0..5127b4b8ea3 100644 --- a/gcc/fortran/match.h +++ b/gcc/fortran/match.h @@ -175,6 +175,7 @@ match gfc_match_omp_masked_taskloop_simd (void); match gfc_match_omp_master (void); match gfc_match_omp_master_taskloop (void); match gfc_match_omp_master_taskloop_simd (void); +match gfc_match_omp_nothing (void); match gfc_match_omp_ordered (void); match gfc_match_omp_ordered_depend (void); match gfc_match_omp_parallel (void); diff --git a/gcc/fortran/openmp.c b/gcc/fortran/openmp.c index 9675b658409..fd219dc9c4d 100644 --- a/gcc/fortran/openmp.c +++ b/gcc/fortran/openmp.c @@ -4797,6 +4797,17 @@ gfc_match_omp_ordered (void) return match_omp (EXEC_OMP_ORDERED, OMP_ORDERED_CLAUSES); } +match +gfc_match_omp_nothing (void) +{ + if (gfc_match_omp_eos () != MATCH_YES) + { + gfc_error ("Unexpected junk after $OMP NOTHING statement at %C"); + return MATCH_ERROR; + } + /* Will use ST_NONE; therefore, no EXEC_OMP_ is needed. */ + return MATCH_YES; +} match gfc_match_omp_ordered_depend (void) diff --git a/gcc/fortran/parse.c b/gcc/fortran/parse.c index 24cc9bfb9f1..d004732677c 100644 --- a/gcc/fortran/parse.c +++ b/gcc/fortran/parse.c @@ -1005,6 +1005,9 @@ decode_omp_directive (void) ST_OMP_MASTER_TASKLOOP); matcho ("master", gfc_match_omp_master, ST_OMP_MASTER); break; + case 'n': + matcho ("nothing", gfc_match_omp_nothing, ST_NONE); + break; case 'l': matcho ("loop", gfc_match_omp_loop, ST_OMP_LOOP); break; diff --git a/gcc/testsuite/gfortran.dg/nothing-1.f90 b/gcc/testsuite/gfortran.dg/nothing-1.f90 new file mode 100644 index 00000000000..9fc24d4bd6c --- /dev/null +++ b/gcc/testsuite/gfortran.dg/nothing-1.f90 @@ -0,0 +1,28 @@ +module m + implicit none (type, external) + !$omp nothing + + type t + !$omp nothing + integer s + end type + +contains + +integer function foo (i) + integer :: i + + !$omp nothing + if (.false.) & +& & !$omp nothing + i = i + 1 + +! In the following, '& & !$' is not a valid OpenMP sentinel and, +! hence, the line is regarded as comment + if (.false.) & +& & !$omp nothing + then + end if + foo = i +end +end module diff --git a/gcc/testsuite/gfortran.dg/nothing-2.f90 b/gcc/testsuite/gfortran.dg/nothing-2.f90 new file mode 100644 index 00000000000..74a4a5a22b0 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/nothing-2.f90 @@ -0,0 +1,7 @@ +pure subroutine foo + !$omp nothing ! { dg-error "OpenMP directives other than SIMD or DECLARE TARGET at .1. may not appear in PURE procedures" } +end subroutine + +subroutine bar + !$omp nothing foo ! { dg-error "Unexpected junk after $OMP NOTHING statement" } +end |