public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc/devel/omp/gcc-11] openmp: More Fortran front-end fixes for metadirectives
@ 2022-02-14 15:59 Kwok Yeung
0 siblings, 0 replies; only message in thread
From: Kwok Yeung @ 2022-02-14 15:59 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:8cb0121af50eacb63098a79ff8c6deae05883c6f
commit 8cb0121af50eacb63098a79ff8c6deae05883c6f
Author: Kwok Cheung Yeung <kcy@codesourcery.com>
Date: Fri Feb 11 15:42:50 2022 +0000
openmp: More Fortran front-end fixes for metadirectives
This adds a check for declarative OpenMP directives in metadirective
variants (already present in the C/C++ front-ends), and fixes an
ICE when an empty metadirective (i.e. just '!$omp metadirective')
is presented.
2022-02-11 Kwok Cheung Yeung <kcy@codesourcery.com>
gcc/fortran/
* gfortran.h (is_omp_declarative_stmt): New.
* openmp.c (match_omp_metadirective): Reject declarative OpenMP
directives with 'sorry'.
* parse.c (parse_omp_metadirective_body): Check that state stack head
is non-null before dereferencing.
(is_omp_declarative_stmt): New.
gcc/testsuite/
* gfortran.dg/gomp/metadirective-2.f90 (main): Test empty
metadirective.
Diff:
---
gcc/fortran/ChangeLog.omp | 9 +++++++++
gcc/fortran/gfortran.h | 1 +
gcc/fortran/openmp.c | 3 +++
gcc/fortran/parse.c | 16 +++++++++++++++-
gcc/testsuite/ChangeLog.omp | 5 +++++
gcc/testsuite/gfortran.dg/gomp/metadirective-2.f90 | 5 ++++-
6 files changed, 37 insertions(+), 2 deletions(-)
diff --git a/gcc/fortran/ChangeLog.omp b/gcc/fortran/ChangeLog.omp
index 070744413db..e76884dbc0c 100644
--- a/gcc/fortran/ChangeLog.omp
+++ b/gcc/fortran/ChangeLog.omp
@@ -1,3 +1,12 @@
+2022-02-11 Kwok Cheung Yeung <kcy@codesourcery.com>
+
+ * gfortran.h (is_omp_declarative_stmt): New.
+ * openmp.c (match_omp_metadirective): Reject declarative OpenMP
+ directives with 'sorry'.
+ * parse.c (parse_omp_metadirective_body): Check that state stack head
+ is non-null before dereferencing.
+ (is_omp_declarative_stmt): New.
+
2022-02-11 Kwok Cheung Yeung <kcy@codesourcery.com>
* decl.c (gfc_match_end): Search for first previous state that is not
diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h
index 338dcad240b..f9b36ca5205 100644
--- a/gcc/fortran/gfortran.h
+++ b/gcc/fortran/gfortran.h
@@ -3833,6 +3833,7 @@ bool gfc_parse_file (void);
void gfc_global_used (gfc_gsymbol *, locus *);
gfc_namespace* gfc_build_block_ns (gfc_namespace *);
gfc_statement match_omp_directive (void);
+bool is_omp_declarative_stmt (gfc_statement);
/* dependency.c */
int gfc_dep_compare_functions (gfc_expr *, gfc_expr *, bool);
diff --git a/gcc/fortran/openmp.c b/gcc/fortran/openmp.c
index 1f82e09f270..43e5be004f9 100644
--- a/gcc/fortran/openmp.c
+++ b/gcc/fortran/openmp.c
@@ -5037,6 +5037,9 @@ match_omp_metadirective (bool begin_p)
gfc_statement directive = match_omp_directive ();
gfc_matching_omp_context_selector = false;
+ if (is_omp_declarative_stmt (directive))
+ sorry ("declarative directive variants are not supported");
+
if (gfc_error_flag_test ())
{
gfc_current_locus = old_loc;
diff --git a/gcc/fortran/parse.c b/gcc/fortran/parse.c
index 7d3aa9e0488..00e2dda2f06 100644
--- a/gcc/fortran/parse.c
+++ b/gcc/fortran/parse.c
@@ -5820,7 +5820,8 @@ parse_omp_metadirective_body (gfc_statement omp_st)
gfc_in_metadirective_body = old_in_metadirective_body;
- *clause->code = *gfc_state_stack->head;
+ if (gfc_state_stack->head)
+ *clause->code = *gfc_state_stack->head;
pop_state ();
gfc_commit_symbols ();
@@ -7082,3 +7083,16 @@ is_oacc (gfc_state_data *sd)
return false;
}
}
+
+/* Return true if ST is a declarative OpenMP statement. */
+bool
+is_omp_declarative_stmt (gfc_statement st)
+{
+ switch (st)
+ {
+ case_omp_decl:
+ return true;
+ default:
+ return false;
+ }
+}
diff --git a/gcc/testsuite/ChangeLog.omp b/gcc/testsuite/ChangeLog.omp
index 2b610c00ef3..07bdb9d0645 100644
--- a/gcc/testsuite/ChangeLog.omp
+++ b/gcc/testsuite/ChangeLog.omp
@@ -1,3 +1,8 @@
+2022-02-11 Kwok Cheung Yeung <kcy@codesourcery.com>
+
+ * gfortran.dg/gomp/metadirective-2.f90 (main): Test empty
+ metadirective.
+
2022-02-11 Kwok Cheung Yeung <kcy@codesourcery.com>
* gfortran.dg/gomp/metadirective-8.f90: New.
diff --git a/gcc/testsuite/gfortran.dg/gomp/metadirective-2.f90 b/gcc/testsuite/gfortran.dg/gomp/metadirective-2.f90
index 06c324589d0..cdd5e85068e 100644
--- a/gcc/testsuite/gfortran.dg/gomp/metadirective-2.f90
+++ b/gcc/testsuite/gfortran.dg/gomp/metadirective-2.f90
@@ -43,7 +43,7 @@ program main
end do
!$omp end metadirective
- ! Test labels in the body
+ ! Test labels in the body.
!$omp begin metadirective &
!$omp& when (device={arch("nvptx")}: parallel do) &
!$omp& when (device={arch("gcn")}: parallel)
@@ -56,4 +56,7 @@ program main
20 continue
end do
!$omp end metadirective
+
+ ! Test empty metadirective.
+ !$omp metadirective
end program
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2022-02-14 15:59 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-02-14 15:59 [gcc/devel/omp/gcc-11] openmp: More Fortran front-end fixes for metadirectives Kwok Yeung
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).