aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/cp/ChangeLog8
-rw-r--r--gcc/cp/cp-gimplify.c17
-rw-r--r--gcc/cp/parser.c2
-rw-r--r--libgomp/ChangeLog5
-rw-r--r--libgomp/testsuite/libgomp.c++/pr93931.C120
5 files changed, 146 insertions, 6 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index bb5f77f..b5d429b 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,11 @@
+2020-03-19 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/93931
+ * parser.c (cp_parser_omp_var_list_no_open): Call process_outer_var_ref
+ on outer_automatic_var_p decls.
+ * cp-gimplify.c (cxx_omp_disregard_value_expr): Return true also for
+ capture proxy decls.
+
2020-03-18 Nathan Sidwell <nathan@acm.org>
PR c++/94147 - mangling of lambdas assigned to globals
diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c
index 23a25e5..87c7e39 100644
--- a/gcc/cp/cp-gimplify.c
+++ b/gcc/cp/cp-gimplify.c
@@ -2260,12 +2260,17 @@ cxx_omp_finish_clause (tree c, gimple_seq *)
bool
cxx_omp_disregard_value_expr (tree decl, bool shared)
{
- return !shared
- && VAR_P (decl)
- && DECL_HAS_VALUE_EXPR_P (decl)
- && DECL_ARTIFICIAL (decl)
- && DECL_LANG_SPECIFIC (decl)
- && DECL_OMP_PRIVATIZED_MEMBER (decl);
+ if (shared)
+ return false;
+ if (VAR_P (decl)
+ && DECL_HAS_VALUE_EXPR_P (decl)
+ && DECL_ARTIFICIAL (decl)
+ && DECL_LANG_SPECIFIC (decl)
+ && DECL_OMP_PRIVATIZED_MEMBER (decl))
+ return true;
+ if (VAR_P (decl) && DECL_CONTEXT (decl) && is_capture_proxy (decl))
+ return true;
+ return false;
}
/* Fold expression X which is used as an rvalue if RVAL is true. */
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 198ab97..cbd5510 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -34059,6 +34059,8 @@ cp_parser_omp_var_list_no_open (cp_parser *parser, enum omp_clause_code kind,
token->location);
}
}
+ if (outer_automatic_var_p (decl))
+ decl = process_outer_var_ref (decl, tf_warning_or_error);
if (decl == error_mark_node)
;
else if (kind != 0)
diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog
index 4d3a4f3..f7cd873 100644
--- a/libgomp/ChangeLog
+++ b/libgomp/ChangeLog
@@ -1,3 +1,8 @@
+2020-03-19 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/93931
+ * testsuite/libgomp.c++/pr93931.C: New test.
+
2020-03-19 Tobias Burnus <tobias@codesourcery.com>
* testsuite/libgomp.c-c++-common/function-not-offloaded.c: Add
diff --git a/libgomp/testsuite/libgomp.c++/pr93931.C b/libgomp/testsuite/libgomp.c++/pr93931.C
new file mode 100644
index 0000000..4d4232e
--- /dev/null
+++ b/libgomp/testsuite/libgomp.c++/pr93931.C
@@ -0,0 +1,120 @@
+// PR c++/93931
+// { dg-do run }
+// { dg-options "-O2 -std=c++14" }
+
+extern "C" void abort ();
+
+void
+sink (int &x)
+{
+ int *volatile p;
+ p = &x;
+ (*p)++;
+}
+
+int
+foo ()
+{
+ int r = 0;
+ [&r] () {
+#pragma omp parallel for reduction(+ : r)
+ for (int i = 0; i < 1024; ++i)
+ r += i;
+ } ();
+ return r;
+}
+
+int
+bar ()
+{
+ int l = 0;
+ [&l] () {
+#pragma omp parallel for lastprivate (l)
+ for (int i = 0; i < 1024; ++i)
+ l = i;
+ } ();
+ return l;
+}
+
+void
+baz ()
+{
+ int f = 18;
+ [&f] () {
+#pragma omp parallel for firstprivate (f)
+ for (int i = 0; i < 1024; ++i)
+ {
+ sink (f);
+ f += 3;
+ sink (f);
+ if (f != 23)
+ abort ();
+ sink (f);
+ f -= 7;
+ sink (f);
+ }
+ } ();
+ if (f != 18)
+ abort ();
+}
+
+int
+qux ()
+{
+ int r = 0;
+ [&] () {
+#pragma omp parallel for reduction(+ : r)
+ for (int i = 0; i < 1024; ++i)
+ r += i;
+ } ();
+ return r;
+}
+
+int
+corge ()
+{
+ int l = 0;
+ [&] () {
+#pragma omp parallel for lastprivate (l)
+ for (int i = 0; i < 1024; ++i)
+ l = i;
+ } ();
+ return l;
+}
+
+void
+garply ()
+{
+ int f = 18;
+ [&] () {
+#pragma omp parallel for firstprivate (f)
+ for (int i = 0; i < 1024; ++i)
+ {
+ sink (f);
+ f += 3;
+ sink (f);
+ if (f != 23)
+ abort ();
+ sink (f);
+ f -= 7;
+ sink (f);
+ }
+ } ();
+ if (f != 18)
+ abort ();
+}
+
+int
+main ()
+{
+ if (foo () != 1024 * 1023 / 2)
+ abort ();
+ if (bar () != 1023)
+ abort ();
+ baz ();
+ if (qux () != 1024 * 1023 / 2)
+ abort ();
+ if (corge () != 1023)
+ abort ();
+ garply ();
+}