From b4a3e26c329f63c9953f4c4e3141c562bf91ce93 Mon Sep 17 00:00:00 2001
From: Thomas Schwinge <thomas@codesourcery.com>
Date: Wed, 25 Nov 2020 13:03:52 +0100
Subject: [PATCH] Fix templatized C++ OpenACC 'cache' directive ICEs
This has been broken forever, whoops...
gcc/cp/
* pt.c (tsubst_omp_clauses): Handle 'OMP_CLAUSE__CACHE_'.
(tsubst_expr): Handle 'OACC_CACHE'.
gcc/testsuite/
* c-c++-common/goacc/cache-1.c: Update.
* c-c++-common/goacc/cache-2.c: Likewise.
* g++.dg/goacc/cache-1.C: New.
* g++.dg/goacc/cache-2.C: Likewise.
libgomp/
* testsuite/libgomp.oacc-c++/cache-1.C: New.
* testsuite/libgomp.oacc-c-c++-common/cache-1.c: Update.
(cherry picked from commit 0cab70604cfda30bc64351b39493ef884ff7ba10)
---
gcc/cp/pt.c | 2 ++
gcc/testsuite/c-c++-common/goacc/cache-1.c | 18 +++++++++++-------
gcc/testsuite/c-c++-common/goacc/cache-2.c | 10 +++++-----
gcc/testsuite/g++.dg/goacc/cache-1.C | 15 +++++++++++++++
.../goacc/cache-2.c => g++.dg/goacc/cache-2.C} | 15 +++++++++++----
libgomp/testsuite/libgomp.oacc-c++/cache-1.C | 13 +++++++++++++
.../libgomp.oacc-c-c++-common/cache-1.c | 12 +++++++++++-
7 files changed, 68 insertions(+), 17 deletions(-)
create mode 100644 gcc/testsuite/g++.dg/goacc/cache-1.C
copy gcc/testsuite/{c-c++-common/goacc/cache-2.c => g++.dg/goacc/cache-2.C} (90%)
create mode 100644 libgomp/testsuite/libgomp.oacc-c++/cache-1.C
@@ -16130,6 +16130,7 @@ tsubst_omp_clauses (tree clauses, enum c_omp_region_type ort,
case OMP_CLAUSE_FROM:
case OMP_CLAUSE_TO:
case OMP_CLAUSE_MAP:
+ case OMP_CLAUSE__CACHE_:
case OMP_CLAUSE_USE_DEVICE_PTR:
case OMP_CLAUSE_IS_DEVICE_PTR:
OMP_CLAUSE_DECL (nc)
@@ -17369,6 +17370,7 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl,
add_stmt (t);
break;
+ case OACC_CACHE:
case OACC_ENTER_DATA:
case OACC_EXIT_DATA:
case OACC_UPDATE:
@@ -1,9 +1,15 @@
-/* OpenACC cache directive: valid usage. */
-/* For execution testing, this file is "#include"d from
- libgomp/testsuite/libgomp.oacc-c-c++-common/cache-1.c. */
+/* OpenACC 'cache' directive: valid usage. */
-int
-main (int argc, char **argv)
+/* See also corresponding C++ variant: '../../g++.dg/goacc/cache-1.C'. */
+
+/* For execution testing, this file is '#include'd from
+ '../../../../libgomp/testsuite/libgomp.oacc-c-c++-common/cache-1.c'. */
+
+#ifdef TEMPLATIZE
+template <int N>
+#endif
+static void
+test ()
{
#define N 2
int a[N], b[N];
@@ -61,6 +67,4 @@ main (int argc, char **argv)
if (a[i] != b[i])
__builtin_abort ();
}
-
- return 0;
}
@@ -1,7 +1,9 @@
-/* OpenACC cache directive: invalid usage. */
+/* OpenACC 'cache' directive: invalid usage. */
-int
-main (int argc, char **argv)
+/* See also corresponding C++ variant: '../../g++.dg/goacc/cache-2.C'. */
+
+static void
+test ()
{
#define N 2
int a[N], b[N];
@@ -52,6 +54,4 @@ main (int argc, char **argv)
if (a[i] != b[i])
__builtin_abort ();
}
-
- return 0;
}
new file mode 100644
@@ -0,0 +1,15 @@
+/* OpenACC 'cache' directive: valid usage. */
+
+/* See also corresponding C/C++ variant '../../c-c++-common/goacc/cache-1.c'. */
+
+/* For execution testing, this file is '#include'd from
+ '../../../../libgomp/testsuite/libgomp.oacc-c++/cache-1.C'. */
+
+#define TEMPLATIZE
+#include "../../c-c++-common/goacc/cache-1.c"
+
+static void
+instantiate ()
+{
+ &test<0>;
+}
similarity index 90%
copy from gcc/testsuite/c-c++-common/goacc/cache-2.c
copy to gcc/testsuite/g++.dg/goacc/cache-2.C
@@ -1,7 +1,10 @@
-/* OpenACC cache directive: invalid usage. */
+/* OpenACC 'cache' directive: invalid usage. */
-int
-main (int argc, char **argv)
+/* See also corresponding C/C++ variant '../../c-c++-common/goacc/cache-2.c'. */
+
+template <int N>
+static void
+test ()
{
#define N 2
int a[N], b[N];
@@ -52,6 +55,10 @@ main (int argc, char **argv)
if (a[i] != b[i])
__builtin_abort ();
}
+}
- return 0;
+static void
+instantiate ()
+{
+ &test<0>;
}
new file mode 100644
@@ -0,0 +1,13 @@
+/* OpenACC 'cache' directive. */
+
+/* See also corresponding C/C++ variant '../libgomp.oacc-c-c++-common/cache-1.c'. */
+
+#include "../../../gcc/testsuite/g++.dg/goacc/cache-1.C"
+
+int
+main (int argc, char *argv[])
+{
+ test<0> ();
+
+ return 0;
+}
@@ -1,3 +1,13 @@
-/* OpenACC cache directive. */
+/* OpenACC 'cache' directive. */
+
+/* See also corresponding C++ variant '../libgomp.oacc-c++/cache-1.C'. */
#include "../../../gcc/testsuite/c-c++-common/goacc/cache-1.c"
+
+int
+main (int argc, char *argv[])
+{
+ test ();
+
+ return 0;
+}
--
2.17.1