I started to run into those in some testcases. Adding the feature
is simpler than to keep editing testcases :-)
(C/C++ support still needs to be added - and for compatibility
reasons it is recommended not to use this variant.)
Unless there are comments, I intent to commit this patch later today.
Tobias
OpenMP/Fortran: Support underscore variant of directive names
OpenMP added underscore variants to multi-word directive names,
which are for Fortran (excluding not yet implemented ones) the
following - now supported since this commit:
declare_mapper, declare_reduction, declare_simd, declare_target,
declare_variant, (end) target_data, target_enter_data,
target_exit_data, target_update, and cancellation_point.
gcc/fortran/ChangeLog:
* parse.cc (decode_omp_directive): Parse underscore
variant of multi-word directive names as well.
libgomp/ChangeLog:
* libgomp.texi (OpenMP 6.0 Impl Status): Mark underscore
variant of multi-word directive names as supported by Fortran.
gcc/testsuite/ChangeLog:
* gfortran.dg/gomp/underscore_directives-2.f90: New test.
* gfortran.dg/gomp/underscore_directives.f90: New test.
gcc/fortran/parse.cc | 20 ++++++
.../gfortran.dg/gomp/underscore_directives-2.f90 | 20 ++++++
.../gfortran.dg/gomp/underscore_directives.f90 | 73 ++++++++++++++++++++++
libgomp/libgomp.texi | 2 +-
4 files changed, 114 insertions(+), 1 deletion(-)
diff --git a/gcc/fortran/parse.cc b/gcc/fortran/parse.cc
index 311dfedabce..c8e60c9d665 100644
--- a/gcc/fortran/parse.cc
+++ b/gcc/fortran/parse.cc
@@ -1049,14 +1049,24 @@ decode_omp_directive (void)
case 'd':
matchdo ("declare mapper", gfc_match_omp_declare_mapper,
ST_OMP_DECLARE_MAPPER);
+ matchdo ("declare_mapper", gfc_match_omp_declare_mapper,
+ ST_OMP_DECLARE_MAPPER);
matchds ("declare reduction", gfc_match_omp_declare_reduction,
ST_OMP_DECLARE_REDUCTION);
+ matchds ("declare_reduction", gfc_match_omp_declare_reduction,
+ ST_OMP_DECLARE_REDUCTION);
matchds ("declare simd", gfc_match_omp_declare_simd,
ST_OMP_DECLARE_SIMD);
+ matchds ("declare_simd", gfc_match_omp_declare_simd,
+ ST_OMP_DECLARE_SIMD);
matchdo ("declare target", gfc_match_omp_declare_target,
ST_OMP_DECLARE_TARGET);
+ matchdo ("declare_target", gfc_match_omp_declare_target,
+ ST_OMP_DECLARE_TARGET);
matchdo ("declare variant", gfc_match_omp_declare_variant,
ST_OMP_DECLARE_VARIANT);
+ matchdo ("declare_variant", gfc_match_omp_declare_variant,
+ ST_OMP_DECLARE_VARIANT);
break;
case 'e':
matchs ("end assume", gfc_match_omp_eos_error, ST_OMP_END_ASSUME);
@@ -1116,6 +1126,8 @@ decode_omp_directive (void)
case 'c':
matcho ("cancellation% point", gfc_match_omp_cancellation_point,
ST_OMP_CANCELLATION_POINT);
+ matcho ("cancellation_point", gfc_match_omp_cancellation_point,
+ ST_OMP_CANCELLATION_POINT);
matcho ("cancel", gfc_match_omp_cancel, ST_OMP_CANCEL);
matcho ("critical", gfc_match_omp_critical, ST_OMP_CRITICAL);
break;
@@ -1186,6 +1198,7 @@ decode_omp_directive (void)
matcho ("end sections", gfc_match_omp_end_nowait, ST_OMP_END_SECTIONS);
matcho ("end single", gfc_match_omp_end_single, ST_OMP_END_SINGLE);
matcho ("end target data", gfc_match_omp_eos_error, ST_OMP_END_TARGET_DATA);
+ matcho ("end target_data", gfc_match_omp_eos_error, ST_OMP_END_TARGET_DATA);
matchs ("end target parallel do simd", gfc_match_omp_end_nowait,
ST_OMP_END_TARGET_PARALLEL_DO_SIMD);
matcho ("end target parallel do", gfc_match_omp_end_nowait,
@@ -1306,10 +1319,15 @@ decode_omp_directive (void)
break;
case 't':
matcho ("target data", gfc_match_omp_target_data, ST_OMP_TARGET_DATA);
+ matcho ("target_data", gfc_match_omp_target_data, ST_OMP_TARGET_DATA);
matcho ("target enter data", gfc_match_omp_target_enter_data,
ST_OMP_TARGET_ENTER_DATA);
+ matcho ("target_enter_data", gfc_match_omp_target_enter_data,
+ ST_OMP_TARGET_ENTER_DATA);
matcho ("target exit data", gfc_match_omp_target_exit_data,
ST_OMP_TARGET_EXIT_DATA);
+ matcho ("target_exit_data", gfc_match_omp_target_exit_data,
+ ST_OMP_TARGET_EXIT_DATA);
matchs ("target parallel do simd", gfc_match_omp_target_parallel_do_simd,
ST_OMP_TARGET_PARALLEL_DO_SIMD);
matcho ("target parallel do", gfc_match_omp_target_parallel_do,
@@ -1335,6 +1353,8 @@ decode_omp_directive (void)
matcho ("target teams", gfc_match_omp_target_teams, ST_OMP_TARGET_TEAMS);
matcho ("target update", gfc_match_omp_target_update,
ST_OMP_TARGET_UPDATE);
+ matcho ("target_update", gfc_match_omp_target_update,
+ ST_OMP_TARGET_UPDATE);
matcho ("target", gfc_match_omp_target, ST_OMP_TARGET);
matcho ("taskgroup", gfc_match_omp_taskgroup, ST_OMP_TASKGROUP);
matchs ("taskloop simd", gfc_match_omp_taskloop_simd,
diff --git a/gcc/testsuite/gfortran.dg/gomp/underscore_directives-2.f90 b/gcc/testsuite/gfortran.dg/gomp/underscore_directives-2.f90
new file mode 100644
index 00000000000..384e2066292
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/gomp/underscore_directives-2.f90
@@ -0,0 +1,20 @@
+! { dg-do compile }
+
+! OpenMP 6 adds underscore variants to the directive names
+! Check declare_mapper here
+
+module m2
+ type t
+ integer :: ptr
+ end type t
+ !$omp declare mapper(mymapper : t :: v) map(v%ptr)
+contains
+ subroutine mapit(y)
+ type(t) :: y
+ ! Must be last until implemented
+ !$omp target_enter_data map(mapper(mymapper), to: y) ! { dg-error "Sorry, declared mapper 'mymapper', used for 'y' at .1., is not yet supported" }
+ end
+end
+
+
+
diff --git a/gcc/testsuite/gfortran.dg/gomp/underscore_directives.f90 b/gcc/testsuite/gfortran.dg/gomp/underscore_directives.f90
new file mode 100644
index 00000000000..ebcc9f9969d
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/gomp/underscore_directives.f90
@@ -0,0 +1,73 @@
+! { dg-do compile }
+! { dg-additional-options "-fdump-tree-original" }
+
+! OpenMP 6 adds underscore variants to the directive names
+! Check all but declare_mapper here.
+
+subroutine test
+ !$omp declare_target enter(test)
+end
+
+subroutine data
+ integer :: x
+ !$omp target_enter_data map(x)
+
+ !$omp target_data map(x)
+ call bar(x)
+ !$omp end target_data
+
+ !$omp target_update from(x)
+
+ !$omp target_exit_data map(x)
+end subroutine data
+
+module m
+contains
+subroutine varfn()
+end
+subroutine basefn()
+ !$omp declare_variant(varfn) match(construct={parallel})
+end
+end
+
+module m3
+!$omp declare_reduction (foo:integer:omp_out = omp_out + omp_in)
+contains
+ integer function foo (x, y)
+ integer, value :: x, y
+ !$omp declare_simd (foo) linear (y : 2)
+ end function foo
+subroutine bar
+ integer :: b, i, a(64)
+ a = 1
+ b = 0
+ !$omp parallel
+ !$omp cancellation_point parallel
+ !$omp critical (bar)
+ b = b + 1
+ !$omp end critical (bar)
+ !$omp cancel parallel
+ !$omp end parallel
+
+ !$omp simd reduction (foo: b)
+ do i = 1, 64
+ b = b + a(i)
+ end do
+end
+end
+
+! { dg-final { scan-tree-dump "#pragma omp target enter data map\\(to:x\\)" "original" } }
+! { dg-final { scan-tree-dump "#pragma omp target data map\\(tofrom:x\\)" "original" } }
+! { dg-final { scan-tree-dump "#pragma omp target update from\\(x\\)" "original" } }
+! { dg-final { scan-tree-dump "#pragma omp target exit data map\\(from:x\\)" "original" } }
+
+! { dg-final { scan-tree-dump "#pragma omp simd linear\\(i:1\\) reduction\\(b\\)" "original" } }
+
+! { dg-final { scan-tree-dump "__attribute__\\(\\(omp declare target \\(device_type\\(any\\)\\)\\)\\)" "original" } }
+! { dg-final { scan-tree-dump "__attribute__\\(\\(omp declare simd \\(linear\\(1:2\\)\\)\\)\\)" "original" } }
+
+! { dg-final { scan-tree-dump "__attribute__\\(\\(omp declare variant base \\(varfn match construct = {parallel}\\)\\)\\)" "original" } }
+! { dg-final { scan-tree-dump "__attribute__\\(\\(omp declare variant variant" "original" } }
+
+! { dg-final { scan-tree-dump "__builtin_GOMP_cancellation_point \\(1\\);" "original" } }
+
diff --git a/libgomp/libgomp.texi b/libgomp/libgomp.texi
index 92d82f2f66c..a358f347fed 100644
--- a/libgomp/libgomp.texi
+++ b/libgomp/libgomp.texi
@@ -641,7 +641,7 @@ to address of matching mapped list item per 5.1, Sect. 2.21.7.2 @tab N @tab
@unnumberedsubsec Other new OpenMP 6.0 features
@multitable @columnfractions .60 .10 .25
-@item Multi-word directives now use underscore by default @tab N @tab
+@item Multi-word directives now use underscore by default @tab P @tab Only in Fortran
@item Relaxed Fortran restrictions to the @code{aligned} clause @tab N @tab
@item Mapping lambda captures @tab N @tab
@item New @code{omp_pause_stop_tool} constant for @code{omp_pause_resource}