summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Burnus <tobias@codesourcery.com>2021-08-18 15:21:18 +0200
committerTobias Burnus <tobias@codesourcery.com>2021-08-18 15:24:22 +0200
commitf74433e70ae94a3b5291e45fea488b1cfdee4a34 (patch)
tree86caeb8480d332f032516f9191bdd42847a65944
parentbe4a4fb516688d7cfe28a80a4aa333f4ecf0b518 (diff)
downloadgcc-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.h1
-rw-r--r--gcc/fortran/openmp.c11
-rw-r--r--gcc/fortran/parse.c3
-rw-r--r--gcc/testsuite/gfortran.dg/nothing-1.f9028
-rw-r--r--gcc/testsuite/gfortran.dg/nothing-2.f907
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