Add support to the Fortran parser for the new OpenMP syntax that allows a
comma after the directive name and between clauses of declare variant.
The C and C++ parsers already support this syntax so only a new test is added.

gcc/fortran/ChangeLog:

        * openmp.cc (gfc_match_omp_declare_variant): Match comma after directive
        name and between clauses.

gcc/testsuite/ChangeLog:

        * gfortran.dg/gomp/declare-variant-2.f90: Remove error test for a comma
        after the directive name.
        * c-c++-common/gomp/adjust-args-5.c: New test.
        * gfortran.dg/gomp/adjust-args-11.f90: New test.
---
 gcc/fortran/openmp.cc                         |  4 ++
 .../c-c++-common/gomp/adjust-args-5.c         | 21 +++++++++
 .../gfortran.dg/gomp/adjust-args-11.f90       | 45 +++++++++++++++++++
 .../gfortran.dg/gomp/declare-variant-2.f90    |  3 --
 4 files changed, 70 insertions(+), 3 deletions(-)
 create mode 100644 gcc/testsuite/c-c++-common/gomp/adjust-args-5.c
 create mode 100644 gcc/testsuite/gfortran.dg/gomp/adjust-args-11.f90

diff --git a/gcc/fortran/openmp.cc b/gcc/fortran/openmp.cc
index 79c0f1b2e62..9d255558dc9 100644
--- a/gcc/fortran/openmp.cc
+++ b/gcc/fortran/openmp.cc
@@ -6595,6 +6595,10 @@ gfc_match_omp_declare_variant (void)
 
   for (;;)
     {
+      gfc_gobble_whitespace ();
+      gfc_match_char (',');
+      gfc_gobble_whitespace ();
+
       enum clause
       {
        match,
diff --git a/gcc/testsuite/c-c++-common/gomp/adjust-args-5.c 
b/gcc/testsuite/c-c++-common/gomp/adjust-args-5.c
new file mode 100644
index 00000000000..863b77458e4
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/gomp/adjust-args-5.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+
+/* Check that the OpenMP 6 syntax with commas after the directive name and
+   between clauses is supported. */
+
+int f (int a, void *b, float c[2]);
+
+#pragma omp declare variant (f), match (construct={dispatch}), adjust_args 
(nothing: a), adjust_args (need_device_ptr: b, c)
+int f0 (int a, void *b, float c[2]);
+
+int test () {
+  int a;
+  void *b;
+  float c[2];
+  struct {int a;} s;
+
+  #pragma omp dispatch, novariants(0), nocontext(1)
+  s.a = f0 (a, b, c);
+
+  return s.a;
+}
diff --git a/gcc/testsuite/gfortran.dg/gomp/adjust-args-11.f90 
b/gcc/testsuite/gfortran.dg/gomp/adjust-args-11.f90
new file mode 100644
index 00000000000..3b26f1b0868
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/gomp/adjust-args-11.f90
@@ -0,0 +1,45 @@
+! { dg-do compile }
+
+! Check that the OpenMP 5.1 syntax with commas between clauses is supported.
+! A comma after the directive name is introduced in 5.2, which is not 
supported 
+! yet.
+
+module main
+  use iso_c_binding, only: c_ptr
+  implicit none
+
+  type :: struct
+    integer :: a
+    real :: b
+  end type
+
+  interface
+    integer function f(a, b, c)
+      import c_ptr
+      integer, intent(in) :: a
+      type(c_ptr), intent(inout) :: b
+      type(c_ptr), intent(out) :: c(:)
+    end function
+    integer function f0(a, b, c)
+      import c_ptr
+      integer, intent(in) :: a
+      type(c_ptr), intent(inout) :: b
+      type(c_ptr), intent(out) :: c(:)
+      !$omp  declare variant (f), match (construct={dispatch}), &
+      !$omp&         adjust_args (nothing: a), adjust_args (need_device_ptr: 
b, c)
+    end function
+  end interface
+
+contains
+subroutine test
+  integer :: a
+  type(c_ptr) :: b
+  type(c_ptr) :: c(2)
+  type(struct) :: s
+
+  !!$omp dispatch, nocontext(.false.), novariants(.false.)   ! Not supported 
yet
+  !$omp dispatch nocontext(.false.), novariants(.false.)
+  s%a = f0 (a, b, c)
+
+end subroutine
+end module
diff --git a/gcc/testsuite/gfortran.dg/gomp/declare-variant-2.f90 
b/gcc/testsuite/gfortran.dg/gomp/declare-variant-2.f90
index 62d2cb96fac..beea713efba 100644
--- a/gcc/testsuite/gfortran.dg/gomp/declare-variant-2.f90
+++ b/gcc/testsuite/gfortran.dg/gomp/declare-variant-2.f90
@@ -182,9 +182,6 @@ contains
   subroutine f74 ()
     !$omp declare variant (f1) match(construct={requires})     ! { dg-warning 
"unknown selector 'requires' for context selector set 'construct' at .1." }
   end subroutine
-  subroutine f75 ()
-    !$omp declare variant (f1),match(construct={parallel})     ! { dg-error 
"expected 'match' or 'adjust_args' at .1." }
-  end subroutine
   subroutine f76 ()
     !$omp declare variant (f1) 
match(implementation={atomic_default_mem_order("relaxed")})     ! { dg-error 
"expected identifier at .1." }
   end subroutine
-- 
2.45.2

Reply via email to