https://gcc.gnu.org/g:4b60a4da49a7fbdf5e58ee9c63dca7a019e4e91f

commit r16-6772-g4b60a4da49a7fbdf5e58ee9c63dca7a019e4e91f
Author: Thomas Schwinge <[email protected]>
Date:   Fri May 30 11:37:46 2025 +0200

    Add 'libgomp.c++/target-std__[...]-concurrent-usm.C' test cases for C++ 
'std::flat_map', 'std::flat_multimap', 'std::flat_multiset', 'std::flat_set'
    
            libgomp/
            * testsuite/libgomp.c++/target-std__flat_map-concurrent-usm.C:
            New.
            * testsuite/libgomp.c++/target-std__flat_multimap-concurrent-usm.C:
            Likewise.
            * testsuite/libgomp.c++/target-std__flat_multiset-concurrent-usm.C:
            Likewise.
            * testsuite/libgomp.c++/target-std__flat_set-concurrent-usm.C:
            Likewise.
            * testsuite/libgomp.c++/target-std__flat_map-concurrent.C: Adjust.
            * testsuite/libgomp.c++/target-std__flat_multimap-concurrent.C:
            Likewise.
            * testsuite/libgomp.c++/target-std__flat_multiset-concurrent.C:
            Likewise.
            * testsuite/libgomp.c++/target-std__flat_set-concurrent.C:
            Likewise.

Diff:
---
 .../libgomp.c++/target-std__flat_map-concurrent-usm.C        |  8 ++++++++
 .../testsuite/libgomp.c++/target-std__flat_map-concurrent.C  | 12 ++++++++++++
 .../libgomp.c++/target-std__flat_multimap-concurrent-usm.C   |  8 ++++++++
 .../libgomp.c++/target-std__flat_multimap-concurrent.C       | 12 ++++++++++++
 .../libgomp.c++/target-std__flat_multiset-concurrent-usm.C   |  8 ++++++++
 .../libgomp.c++/target-std__flat_multiset-concurrent.C       | 10 ++++++++++
 .../libgomp.c++/target-std__flat_set-concurrent-usm.C        |  8 ++++++++
 .../testsuite/libgomp.c++/target-std__flat_set-concurrent.C  | 10 ++++++++++
 8 files changed, 76 insertions(+)

diff --git 
a/libgomp/testsuite/libgomp.c++/target-std__flat_map-concurrent-usm.C 
b/libgomp/testsuite/libgomp.c++/target-std__flat_map-concurrent-usm.C
new file mode 100644
index 000000000000..ac1fc9b53f7c
--- /dev/null
+++ b/libgomp/testsuite/libgomp.c++/target-std__flat_map-concurrent-usm.C
@@ -0,0 +1,8 @@
+// { dg-additional-options "-std=c++23" }
+
+/* { dg-require-effective-target omp_usm } */
+#pragma omp requires unified_shared_memory self_maps
+#define OMP_USM
+#define MEM_SHARED
+
+#include "target-std__flat_map-concurrent.C"
diff --git a/libgomp/testsuite/libgomp.c++/target-std__flat_map-concurrent.C 
b/libgomp/testsuite/libgomp.c++/target-std__flat_map-concurrent.C
index 958b75e72092..311f9fc4ef62 100644
--- a/libgomp/testsuite/libgomp.c++/target-std__flat_map-concurrent.C
+++ b/libgomp/testsuite/libgomp.c++/target-std__flat_map-concurrent.C
@@ -39,7 +39,9 @@ int main (void)
   init (keys, true);
   init (data, false);
 
+#ifndef MEM_SHARED
   #pragma omp target enter data map (to: keys[ :N], data[ :N]) map (alloc: 
_map)
+#endif
 
   #pragma omp target
     {
@@ -55,12 +57,22 @@ int main (void)
     for (int i = 0; i < N; ++i)
       sum += (long long) keys[i] * _map[keys[i]];
 
+#ifdef OMP_USM
+  #pragma omp target
+    /* Restore the object into pristine state.  In particular, deallocate
+       any memory allocated during device execution, which otherwise, back
+       on the host, we'd SIGSEGV on, when attempting to deallocate during
+       destruction of the object.  */
+    __typeof__ (_map){}.swap (_map);
+#endif
 #ifndef MEM_SHARED
   #pragma omp target
     _map.~flat_map ();
 #endif
 
+#ifndef MEM_SHARED
   #pragma omp target exit data map (release: _map)
+#endif
 
   bool ok = validate (sum, keys, data);
   return ok ? 0 : 1;
diff --git 
a/libgomp/testsuite/libgomp.c++/target-std__flat_multimap-concurrent-usm.C 
b/libgomp/testsuite/libgomp.c++/target-std__flat_multimap-concurrent-usm.C
new file mode 100644
index 000000000000..d772f63c84a1
--- /dev/null
+++ b/libgomp/testsuite/libgomp.c++/target-std__flat_multimap-concurrent-usm.C
@@ -0,0 +1,8 @@
+// { dg-additional-options "-std=c++23" }
+
+/* { dg-require-effective-target omp_usm } */
+#pragma omp requires unified_shared_memory self_maps
+#define OMP_USM
+#define MEM_SHARED
+
+#include "target-std__flat_multimap-concurrent.C"
diff --git 
a/libgomp/testsuite/libgomp.c++/target-std__flat_multimap-concurrent.C 
b/libgomp/testsuite/libgomp.c++/target-std__flat_multimap-concurrent.C
index cee63236750c..0afbd56138f8 100644
--- a/libgomp/testsuite/libgomp.c++/target-std__flat_multimap-concurrent.C
+++ b/libgomp/testsuite/libgomp.c++/target-std__flat_multimap-concurrent.C
@@ -33,7 +33,9 @@ int main (void)
   init (keys, KEY_MAX);
   init (data, RAND_MAX);
 
+#ifndef MEM_SHARED
   #pragma omp target enter data map (to: keys[ :N], data[ :N]) map (alloc: 
_map)
+#endif
 
   #pragma omp target
     {
@@ -54,12 +56,22 @@ int main (void)
        }
       }
 
+#ifdef OMP_USM
+  #pragma omp target
+    /* Restore the object into pristine state.  In particular, deallocate
+       any memory allocated during device execution, which otherwise, back
+       on the host, we'd SIGSEGV on, when attempting to deallocate during
+       destruction of the object.  */
+    __typeof__ (_map){}.swap (_map);
+#endif
 #ifndef MEM_SHARED
   #pragma omp target
     _map.~flat_multimap ();
 #endif
 
+#ifndef MEM_SHARED
   #pragma omp target exit data map (release: _map)
+#endif
 
   bool ok = validate (sum, keys, data);
   return ok ? 0 : 1;
diff --git 
a/libgomp/testsuite/libgomp.c++/target-std__flat_multiset-concurrent-usm.C 
b/libgomp/testsuite/libgomp.c++/target-std__flat_multiset-concurrent-usm.C
new file mode 100644
index 000000000000..56d60a2669af
--- /dev/null
+++ b/libgomp/testsuite/libgomp.c++/target-std__flat_multiset-concurrent-usm.C
@@ -0,0 +1,8 @@
+// { dg-additional-options "-std=c++23" }
+
+/* { dg-require-effective-target omp_usm } */
+#pragma omp requires unified_shared_memory self_maps
+#define OMP_USM
+#define MEM_SHARED
+
+#include "target-std__flat_multiset-concurrent.C"
diff --git 
a/libgomp/testsuite/libgomp.c++/target-std__flat_multiset-concurrent.C 
b/libgomp/testsuite/libgomp.c++/target-std__flat_multiset-concurrent.C
index 13d2ff921d05..a2af7f24ff0d 100644
--- a/libgomp/testsuite/libgomp.c++/target-std__flat_multiset-concurrent.C
+++ b/libgomp/testsuite/libgomp.c++/target-std__flat_multiset-concurrent.C
@@ -34,7 +34,9 @@ int main (void)
   srand (time (NULL));
   init (data);
 
+#ifndef MEM_SHARED
   #pragma omp target data map (to: data[ :N]) map (alloc: set)
+#endif
     {
       #pragma omp target
        {
@@ -49,6 +51,14 @@ int main (void)
        for (int i = 0; i < MAX; ++i)
          sum += i * set.count (i);
 
+#ifdef OMP_USM
+      #pragma omp target
+       /* Restore the object into pristine state.  In particular, deallocate
+          any memory allocated during device execution, which otherwise, back
+          on the host, we'd SIGSEGV on, when attempting to deallocate during
+          destruction of the object.  */
+       __typeof__ (set){}.swap (set);
+#endif
 #ifndef MEM_SHARED
       #pragma omp target
        set.~flat_multiset ();
diff --git 
a/libgomp/testsuite/libgomp.c++/target-std__flat_set-concurrent-usm.C 
b/libgomp/testsuite/libgomp.c++/target-std__flat_set-concurrent-usm.C
new file mode 100644
index 000000000000..1532e6c31734
--- /dev/null
+++ b/libgomp/testsuite/libgomp.c++/target-std__flat_set-concurrent-usm.C
@@ -0,0 +1,8 @@
+// { dg-additional-options "-std=c++23" }
+
+/* { dg-require-effective-target omp_usm } */
+#pragma omp requires unified_shared_memory self_maps
+#define OMP_USM
+#define MEM_SHARED
+
+#include "target-std__flat_set-concurrent.C"
diff --git a/libgomp/testsuite/libgomp.c++/target-std__flat_set-concurrent.C 
b/libgomp/testsuite/libgomp.c++/target-std__flat_set-concurrent.C
index 0f4a1a8e374f..dce213c213c8 100644
--- a/libgomp/testsuite/libgomp.c++/target-std__flat_set-concurrent.C
+++ b/libgomp/testsuite/libgomp.c++/target-std__flat_set-concurrent.C
@@ -40,7 +40,9 @@ int main (void)
   srand (time (NULL));
   init (data);
 
+#ifndef MEM_SHARED
   #pragma omp target data map (to: data[ :N]) map (alloc: _set)
+#endif
     {
       #pragma omp target
        {
@@ -56,6 +58,14 @@ int main (void)
          if (_set.count (i) > 0)
            sum += i;
 
+#ifdef OMP_USM
+      #pragma omp target
+       /* Restore the object into pristine state.  In particular, deallocate
+          any memory allocated during device execution, which otherwise, back
+          on the host, we'd SIGSEGV on, when attempting to deallocate during
+          destruction of the object.  */
+       __typeof__ (_set){}.swap (_set);
+#endif
 #ifndef MEM_SHARED
       #pragma omp target
        _set.~flat_set ();

Reply via email to