openmp: c++: Consider typeinfo decls to be predetermined shared [PR91118]
authorJakub Jelinek <jakub@redhat.com>
Wed, 29 Jan 2020 08:41:42 +0000 (09:41 +0100)
committerJakub Jelinek <jakub@redhat.com>
Wed, 29 Jan 2020 08:41:42 +0000 (09:41 +0100)
If the typeinfo decls appear in OpenMP default(none) regions, as we no longer
predetermine const with no mutable members, they are diagnosed as errors,
but it isn't something the users can actually provide explicit sharing for in
the clauses.

2020-01-29  Jakub Jelinek  <jakub@redhat.com>

PR c++/91118
* cp-gimplify.c (cxx_omp_predetermined_sharing): Return
OMP_CLAUSE_DEFAULT_SHARED for typeinfo decls.

* g++.dg/gomp/pr91118-1.C: New test.
* g++.dg/gomp/pr91118-2.C: New test.

gcc/cp/ChangeLog
gcc/cp/cp-gimplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/gomp/pr91118-1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/gomp/pr91118-2.C [new file with mode: 0644]

index 9392c850750651291a5f0c27e3277e43c4cd9077..4dcdb0428f1a7c492907f0dfa8bb5804cea5a321 100644 (file)
@@ -1,3 +1,9 @@
+2020-01-29  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/91118
+       * cp-gimplify.c (cxx_omp_predetermined_sharing): Return
+       OMP_CLAUSE_DEFAULT_SHARED for typeinfo decls.
+
 2020-01-28  Jason Merrill  <jason@redhat.com>
 
        PR c++/93442
index f3aeb7475da51baf539b3eda37e1a14567087b64..4fb3a1a8b8af39bdb95a5031adbe3ab4f7f01762 100644 (file)
@@ -2187,6 +2187,10 @@ cxx_omp_predetermined_sharing (tree decl)
           && DECL_OMP_PRIVATIZED_MEMBER (decl)))
     return OMP_CLAUSE_DEFAULT_SHARED;
 
+  /* Similarly for typeinfo symbols.  */
+  if (VAR_P (decl) && DECL_ARTIFICIAL (decl) && DECL_TINFO_P (decl))
+    return OMP_CLAUSE_DEFAULT_SHARED;
+
   return OMP_CLAUSE_DEFAULT_UNSPECIFIED;
 }
 
index d13de9a3f848122c03e334dc3219e2e6b78e3cae..01aaaf509daee07b8891ce553347868a463fd75b 100644 (file)
@@ -1,5 +1,9 @@
 2020-01-29  Jakub Jelinek  <jakub@redhat.com>
 
+       PR c++/91118
+       * g++.dg/gomp/pr91118-1.C: New test.
+       * g++.dg/gomp/pr91118-2.C: New test.
+
        PR fortran/93463
        * gfortran.dg/goacc/pr93463.f90: New test.
 
diff --git a/gcc/testsuite/g++.dg/gomp/pr91118-1.C b/gcc/testsuite/g++.dg/gomp/pr91118-1.C
new file mode 100644 (file)
index 0000000..f29d69d
--- /dev/null
@@ -0,0 +1,12 @@
+// PR c++/91118
+// { dg-do compile }
+// { dg-additional-options "-fsanitize=undefined" }
+
+#include <iostream>
+
+void
+foo ()
+{
+#pragma omp parallel default(none) shared(std::cerr)
+  std::cerr << "hello" << std::endl;
+}
diff --git a/gcc/testsuite/g++.dg/gomp/pr91118-2.C b/gcc/testsuite/g++.dg/gomp/pr91118-2.C
new file mode 100644 (file)
index 0000000..80f1e3e
--- /dev/null
@@ -0,0 +1,14 @@
+// PR c++/91118
+// { dg-do compile }
+
+#include <typeinfo>
+
+struct S { virtual ~S (); };
+void bar (const std::type_info &, const std::type_info &);
+
+void
+foo (S *p)
+{
+  #pragma omp parallel default (none) firstprivate (p)
+    bar (typeid (*p), typeid (S));
+}