re PR c++/81130 (ICE OpenMP shared clause in gimplify_var_or_parm_decl, at gimplify...
authorJakub Jelinek <jakub@redhat.com>
Wed, 21 Jun 2017 10:58:00 +0000 (12:58 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 21 Jun 2017 10:58:00 +0000 (12:58 +0200)
PR c++/81130
* gimplify.c (omp_add_variable): Don't force GOVD_SEEN for types
with ctors/dtors if GOVD_SHARED is set.

* testsuite/libgomp.c++/pr81130.C: New test.

From-SVN: r249445

gcc/ChangeLog
gcc/gimplify.c
libgomp/ChangeLog
libgomp/testsuite/libgomp.c++/pr81130.C [new file with mode: 0644]

index c9ee7031e9800087474257d8cd3fe8c8c7d750e1..a40820ba10e0b799bf35fe5f96c0404d50b06952 100644 (file)
@@ -1,3 +1,9 @@
+2017-06-21  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/81130
+       * gimplify.c (omp_add_variable): Don't force GOVD_SEEN for types
+       with ctors/dtors if GOVD_SHARED is set.
+
 2017-06-21  Wilco Dijkstra  <wdijkstr@arm.com>
 
        * config/aarch64/aarch64.md (movti_aarch64):
index cf82f95160a22c0210fafbbb95c74c4b72535983..13760c0f20a6de677f7a771d0d5784e824ad1027 100644 (file)
@@ -6634,9 +6634,11 @@ omp_add_variable (struct gimplify_omp_ctx *ctx, tree decl, unsigned int flags)
     return;
 
   /* Never elide decls whose type has TREE_ADDRESSABLE set.  This means
-     there are constructors involved somewhere.  */
-  if (TREE_ADDRESSABLE (TREE_TYPE (decl))
-      || TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl)))
+     there are constructors involved somewhere.  Exception is a shared clause,
+     there is nothing privatized in that case.  */
+  if ((flags & GOVD_SHARED) == 0
+      && (TREE_ADDRESSABLE (TREE_TYPE (decl))
+         || TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl))))
     flags |= GOVD_SEEN;
 
   n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
index 9f4b0527746bfdd35a138417577d74a844993413..da9946fed949d06b8037ad3a54607f1af3cd5ee1 100644 (file)
@@ -1,3 +1,8 @@
+2017-06-21  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/81130
+       * testsuite/libgomp.c++/pr81130.C: New test.
+
 2017-06-17  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
        * testsuite/libgomp.fortran/strassen.f90: Remove dg-skip-if
diff --git a/libgomp/testsuite/libgomp.c++/pr81130.C b/libgomp/testsuite/libgomp.c++/pr81130.C
new file mode 100644 (file)
index 0000000..f2cb571
--- /dev/null
@@ -0,0 +1,41 @@
+// PR c++/81130
+// { dg-do run }
+
+struct A
+{
+  A ();
+  ~A ();
+  int a;
+};
+
+A::A ()
+{
+  a = 0;
+}
+
+A::~A ()
+{
+}
+
+struct B
+{
+  A b;
+  int c;
+  B () : c (1)
+  {
+#pragma omp parallel shared (b, c) num_threads (2)
+#pragma omp master
+    {
+      b.a++;
+      c += 2;
+    }
+  }
+};
+
+int
+main ()
+{
+  B v;
+  if (v.b.a != 1 || v.c != 3)
+    __builtin_abort ();
+}