https://gcc.gnu.org/g:1f94d02d9870ea5f1b511241d4d25bd39d54dcc8

commit r17-5201-g1f94d02d9870ea5f1b511241d4d25bd39d54dcc8
Author: Tobias Burnus <[email protected]>
Date:   Wed Oct 14 16:18:15 2026 +0200

    OpenMP/Fortran: Support 'cgroup' modifier to dyn_groupprivate clause
    
    Commit r16-5633-g26d41e245dbba3 added groupprivate parsing support, but
    missed to parse the access-group modifier (with the only value 'cgroup',
    which is also the default). - This commit adds the parsing support.
    
    gcc/fortran/ChangeLog:
    
            * openmp.cc (gfc_match_omp_clauses): Handle 'cgroup' modifier to
            'dyn_groupprivate'.
    
    gcc/testsuite/ChangeLog:
    
            * gfortran.dg/gomp/dyn_groupprivate-1.f90: Add tests related to
            the 'cgroup' modifier.
            * gfortran.dg/gomp/dyn_groupprivate-2.f90: Likewise.

Diff:
---
 gcc/fortran/openmp.cc                              | 82 +++++++++++++++++++---
 .../gfortran.dg/gomp/dyn_groupprivate-1.f90        | 20 +++++-
 .../gfortran.dg/gomp/dyn_groupprivate-2.f90        | 13 +++-
 3 files changed, 105 insertions(+), 10 deletions(-)

diff --git a/gcc/fortran/openmp.cc b/gcc/fortran/openmp.cc
index c1fe7e22e43c..98adc8e0a84b 100644
--- a/gcc/fortran/openmp.cc
+++ b/gcc/fortran/openmp.cc
@@ -3447,16 +3447,82 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const 
omp_mask mask,
              && gfc_match_dupl_check (!c->dyn_groupprivate,
                                       "dyn_groupprivate", true) == MATCH_YES)
            {
-             if (gfc_match ("fallback ( abort ) : ") == MATCH_YES)
-               c->fallback = OMP_FALLBACK_ABORT;
-             else if (gfc_match ("fallback ( default_mem ) : ") == MATCH_YES)
-               c->fallback = OMP_FALLBACK_DEFAULT_MEM;
-             else if (gfc_match ("fallback ( null ) : ") == MATCH_YES)
-               c->fallback = OMP_FALLBACK_NULL;
+             bool cgroup = false;
+             bool first = true;
+             bool error_p = false;
+             do
+               {
+                 old_loc = gfc_current_locus;
+                 if (gfc_match ("cgroup ") == MATCH_YES)
+                   {
+                     if (cgroup)
+                       {
+                         gfc_error ("Duplicated %<cgroup%> modifier at %L",
+                                    &old_loc);
+                         goto error;
+                       }
+                     cgroup = true;
+                   }
+                 else if (gfc_match ("fallback ( ") == MATCH_YES)
+                   {
+                     if (c->fallback != OMP_FALLBACK_NONE)
+                       {
+                         gfc_error ("Duplicated %<fallback%> modifier at %L",
+                                    &old_loc);
+                         goto error;
+                       }
+                     old_loc = gfc_current_locus;
+                     if (gfc_match ("abort ) ") == MATCH_YES)
+                       c->fallback = OMP_FALLBACK_ABORT;
+                     else if (gfc_match ("default_mem ) ") == MATCH_YES)
+                       c->fallback = OMP_FALLBACK_DEFAULT_MEM;
+                     else if (gfc_match ("null ) ") == MATCH_YES)
+                       c->fallback = OMP_FALLBACK_NULL;
+                     else
+                       {
+                         gfc_error ("Expected %<abort%>, %<default_mem%> or "
+                                    "%<null%> followed by %<)%> at %L",
+                                    &old_loc);
+                         goto error;
+                       }
+                   }
+                 else if (!first)
+                   {
+                     gfc_error ("Expected %<cgroup%> or %<fallback%> clause at 
%C");
+                     goto error;
+                   }
+                 if (gfc_match (", ") == MATCH_YES)
+                   {
+                     first = false;
+                     continue;
+                   }
+                 if (gfc_match (": ") == MATCH_YES)
+                   {
+                     old_loc = gfc_current_locus;
+                     break;
+                   }
+                 if (!first)
+                   {
+                     gfc_error ("Expected %<:%> at %C");
+                     goto error;
+                   }
+                 error_p = true;
+                 break;
+               }
+             while (true);
              if (gfc_match_expr (&c->dyn_groupprivate) != MATCH_YES)
-               return MATCH_ERROR;
+               {
+                 gfc_error ("Expected numeric expression at %L, optionally 
preceeded by "
+                            "the %<cgroup%> and %<fallback%> modifier", 
&old_loc);
+                 goto error;
+               }
+             if (error_p)
+               c->fallback = OMP_FALLBACK_NONE;
              if (gfc_match (" )") != MATCH_YES)
-               goto error;
+               {
+                 gfc_error ("Expected %<)%> at %C");
+                 goto error;
+               }
              continue;
            }
          break;
diff --git a/gcc/testsuite/gfortran.dg/gomp/dyn_groupprivate-1.f90 
b/gcc/testsuite/gfortran.dg/gomp/dyn_groupprivate-1.f90
index a3f86150d5e4..4a2379453965 100644
--- a/gcc/testsuite/gfortran.dg/gomp/dyn_groupprivate-1.f90
+++ b/gcc/testsuite/gfortran.dg/gomp/dyn_groupprivate-1.f90
@@ -3,8 +3,9 @@
 
 implicit none
 
-integer :: N
+integer :: N, M
 N = 1024
+M = 128
 
 !$omp target dyn_groupprivate(1024)  ! { dg-message "sorry, unimplemented: 
'dyn_groupprivate' clause" }
 !$omp end target
@@ -20,6 +21,19 @@ N = 1024
 
 !$omp target dyn_groupprivate ( fallback ( default_mem ) : N)  ! { dg-message 
"sorry, unimplemented: 'dyn_groupprivate' clause" }
 !$omp end target
+
+!$omp target dyn_groupprivate(cgroup : 4096)  ! { dg-message "sorry, 
unimplemented: 'dyn_groupprivate' clause" }
+!$omp end target
+
+!$omp target dyn_groupprivate ( fallback ( abort ) , cgroup : M)  ! { 
dg-message "sorry, unimplemented: 'dyn_groupprivate' clause" }
+!$omp end target
+
+!$omp target dyn_groupprivate ( cgroup, fallback ( null ) : M)  ! { dg-message 
"sorry, unimplemented: 'dyn_groupprivate' clause" }
+!$omp end target
+
+!$omp target dyn_groupprivate ( fallback ( default_mem ),cgroup : M)  ! { 
dg-message "sorry, unimplemented: 'dyn_groupprivate' clause" }
+!$omp end target
+
 end
 
 ! { dg-final { scan-tree-dump-times "#pragma omp target 
dyn_groupprivate\\(1024\\)" 1 "original" } }
@@ -27,3 +41,7 @@ end
 ! { dg-final { scan-tree-dump-times "#pragma omp target 
dyn_groupprivate\\(fallback\\(abort\\):n\\)" 1 "original" } }
 ! { dg-final { scan-tree-dump-times "#pragma omp target 
dyn_groupprivate\\(fallback\\(null\\):n\\)" 1 "original" } }
 ! { dg-final { scan-tree-dump-times "#pragma omp target 
dyn_groupprivate\\(fallback\\(default_mem\\):n\\)" 1 "original" } }
+! { dg-final { scan-tree-dump-times "#pragma omp target 
dyn_groupprivate\\(4096\\)" 1 "original" } }
+! { dg-final { scan-tree-dump-times "#pragma omp target 
dyn_groupprivate\\(fallback\\(abort\\):m\\)" 1 "original" } }
+! { dg-final { scan-tree-dump-times "#pragma omp target 
dyn_groupprivate\\(fallback\\(null\\):m\\)" 1 "original" } }
+! { dg-final { scan-tree-dump-times "#pragma omp target 
dyn_groupprivate\\(fallback\\(default_mem\\):m\\)" 1 "original" } }
diff --git a/gcc/testsuite/gfortran.dg/gomp/dyn_groupprivate-2.f90 
b/gcc/testsuite/gfortran.dg/gomp/dyn_groupprivate-2.f90
index 8410334f4f5d..4756ad66f65d 100644
--- a/gcc/testsuite/gfortran.dg/gomp/dyn_groupprivate-2.f90
+++ b/gcc/testsuite/gfortran.dg/gomp/dyn_groupprivate-2.f90
@@ -19,7 +19,7 @@ block; end block
 !$omp target dyn_groupprivate (0 * M-1)  ! { dg-warning "INTEGER expression of 
DYN_GROUPPRIVATE clause at .1. must be non-negative \\\[-Wopenmp\\\]" }
 block; end block
 
-!$omp target dyn_groupprivate ( fallback ( other ) : N)  ! { dg-error "Failed 
to match clause" }
+!$omp target dyn_groupprivate ( fallback ( other ) : N)  ! { dg-error 
"Expected 'abort', 'default_mem' or 'null' followed by '\\)' at .1." }
 block; end block
 
 !$omp target dyn_groupprivate ( A )  ! { dg-error "DYN_GROUPPRIVATE clause at 
.1. requires a scalar INTEGER expression" }
@@ -28,4 +28,15 @@ block; end block
 !$omp target dyn_groupprivate ( 1024. )  ! { dg-error "DYN_GROUPPRIVATE clause 
at .1. requires a scalar INTEGER expression" }
 block; end block
 
+!$omp target dyn_groupprivate ( fallback(null) cgroup: 1024. )  ! { dg-error 
"Expected '\\)' at .1." }
+block; end block
+
+!$omp target dyn_groupprivate ( fallback(default_mem),thread: 1024. )  ! { 
dg-error "Expected 'cgroup' or 'fallback' clause at .1." }
+block; end block
+
+!$omp target dyn_groupprivate ( cgroup,fallback(null),cgroup: 1024. )  ! { 
dg-error "Duplicated 'cgroup' modifier at .1." }
+block; end block
+
+!$omp target dyn_groupprivate ( fallback(abort),cgroup, fallback(abort): 1024. 
)  ! { dg-error "Duplicated 'fallback' modifier at .1." }
+block; end block
 end

Reply via email to