PR libgomp/96835
        libgomp/
        * testsuite/libgomp.c++/pr96835-1.C: New.
        * testsuite/libgomp.c++/pr96835-1-O0.C: Likewise.
        * testsuite/libgomp.oacc-c++/pr96835-1.C: Likewise.
---
 libgomp/testsuite/libgomp.c++/pr96835-1-O0.C  |  3 ++
 libgomp/testsuite/libgomp.c++/pr96835-1.C     | 45 +++++++++++++++++++
 .../testsuite/libgomp.oacc-c++/pr96835-1.C    |  6 +++
 3 files changed, 54 insertions(+)
 create mode 100644 libgomp/testsuite/libgomp.c++/pr96835-1-O0.C
 create mode 100644 libgomp/testsuite/libgomp.c++/pr96835-1.C
 create mode 100644 libgomp/testsuite/libgomp.oacc-c++/pr96835-1.C

diff --git a/libgomp/testsuite/libgomp.c++/pr96835-1-O0.C 
b/libgomp/testsuite/libgomp.c++/pr96835-1-O0.C
new file mode 100644
index 000000000000..85e42909e29f
--- /dev/null
+++ b/libgomp/testsuite/libgomp.c++/pr96835-1-O0.C
@@ -0,0 +1,3 @@
+// { dg-additional-options -O0 }
+
+#include "pr96835-1.C"
diff --git a/libgomp/testsuite/libgomp.c++/pr96835-1.C 
b/libgomp/testsuite/libgomp.c++/pr96835-1.C
new file mode 100644
index 000000000000..c9f6475eeb91
--- /dev/null
+++ b/libgomp/testsuite/libgomp.c++/pr96835-1.C
@@ -0,0 +1,45 @@
+// See also '../libgomp.oacc-c++/pr96835-1.C'.
+#ifndef ALWAYS_INLINE
+# define ALWAYS_INLINE
+#endif
+
+#pragma omp declare target
+
+template<int sz>
+struct vector {
+  int values_[sz];
+  vector();
+  ALWAYS_INLINE
+  vector(int const& init_val);
+  ALWAYS_INLINE
+  int dot(vector o) {
+    int res = 0;
+    for (int i = 0; i < sz; ++ i)
+      res += values_[i] * o.values_[i];
+    return res;
+  }
+};
+
+template<int sz>
+vector<sz>::vector(int const& init_val) {
+  for (int i = 0; i < sz; ++ i) values_[i] = init_val;
+}
+template<int sz>
+vector<sz>::vector() : vector(0) {
+}
+
+#pragma omp end declare target
+
+int main() {
+  int res = 0;
+  #pragma omp target map(from:res)
+  #pragma acc serial copyout(res)
+  {
+    vector<4> v1(1);
+    vector<4> v2(2);
+    res = v1.dot(v2);
+  }
+  if (res != 8)
+    __builtin_abort();
+  return 0;
+}
diff --git a/libgomp/testsuite/libgomp.oacc-c++/pr96835-1.C 
b/libgomp/testsuite/libgomp.oacc-c++/pr96835-1.C
new file mode 100644
index 000000000000..0a6ee22ec3c9
--- /dev/null
+++ b/libgomp/testsuite/libgomp.oacc-c++/pr96835-1.C
@@ -0,0 +1,6 @@
+// { dg-additional-options -fno-inline } for stable results regarding OpenACC 
'routine'.
+// But actually, as none of the '#pragma acc routine' syntax is accepted (see 
'../libgomp.c++/pr101544-1.C'), force inlining:
+#define ALWAYS_INLINE inline __attribute__((always_inline))
+
+#include "../libgomp.c++/pr96835-1.C"
+//TODO { dg-prune-output {using 'vector_length \(32\)', ignoring 1} }
-- 
2.34.1

Reply via email to