Commit d54d1fc3 by Jakub Jelinek Committed by Jakub Jelinek

re PR c++/81130 (ICE OpenMP shared clause in gimplify_var_or_parm_decl, at gimplify.c:2584)

	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
parent 9fe9816b
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> 2017-06-21 Wilco Dijkstra <wdijkstr@arm.com>
* config/aarch64/aarch64.md (movti_aarch64): * config/aarch64/aarch64.md (movti_aarch64):
......
...@@ -6634,9 +6634,11 @@ omp_add_variable (struct gimplify_omp_ctx *ctx, tree decl, unsigned int flags) ...@@ -6634,9 +6634,11 @@ omp_add_variable (struct gimplify_omp_ctx *ctx, tree decl, unsigned int flags)
return; return;
/* Never elide decls whose type has TREE_ADDRESSABLE set. This means /* Never elide decls whose type has TREE_ADDRESSABLE set. This means
there are constructors involved somewhere. */ there are constructors involved somewhere. Exception is a shared clause,
if (TREE_ADDRESSABLE (TREE_TYPE (decl)) there is nothing privatized in that case. */
|| TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl))) if ((flags & GOVD_SHARED) == 0
&& (TREE_ADDRESSABLE (TREE_TYPE (decl))
|| TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl))))
flags |= GOVD_SEEN; flags |= GOVD_SEEN;
n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl); n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
......
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> 2017-06-17 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
* testsuite/libgomp.fortran/strassen.f90: Remove dg-skip-if * testsuite/libgomp.fortran/strassen.f90: Remove dg-skip-if
......
// 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 ();
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment