c++: Fix up handling of captured vars in lambdas in OpenMP clauses [PR93931]
authorJakub Jelinek <jakub@redhat.com>
Thu, 19 Mar 2020 11:22:47 +0000 (12:22 +0100)
committerJakub Jelinek <jakub@redhat.com>
Thu, 19 Mar 2020 11:22:47 +0000 (12:22 +0100)
commit02f7334ac93f53ed06d881beb611e88be36dc56a
tree25393775d4aa2281b84448fb9a60525f6a2d8513
parentbb83e069ebadf0a724298f80a65b1775eff9cfab
c++: Fix up handling of captured vars in lambdas in OpenMP clauses [PR93931]

Without the parser.c change we were ICEing on the testcase, because while the
uses of the captured vars inside of the constructs were replaced with capture
proxy decls, we didn't do that for decls in OpenMP clauses.

With that fixed, we don't ICE anymore, but the testcase is miscompiled and FAILs
at runtime.  This is because the capture proxy decls have DECL_VALUE_EXPR and
during gimplification we were gimplifying those to their DECL_VALUE_EXPRs.
That is fine for shared vars, but for privatized ones we must not do that.
So that is what the cp-gimplify.c changes do.  Had to add a DECL_CONTEXT check
before calling is_capture_proxy because some VAR_DECLs don't have DECL_CONTEXT
set (yet) and is_capture_proxy relies on that being non-NULL always.

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.

* testsuite/libgomp.c++/pr93931.C: New test.
gcc/cp/ChangeLog
gcc/cp/cp-gimplify.c
gcc/cp/parser.c
libgomp/ChangeLog
libgomp/testsuite/libgomp.c++/pr93931.C [new file with mode: 0644]