From 8b44f8ec4b20bf22350e484bb49303a36085b0d5 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 31 Jan 2019 00:28:53 +0100 Subject: [PATCH] re PR c++/88988 (ICE: Segmentation fault (in lookup_name_real_1)) PR c++/88988 * lambda.c (is_capture_proxy): Don't return true for DECL_OMP_PRIVATIZED_MEMBER artificial vars. * testsuite/libgomp.c++/pr88988.C: New test. From-SVN: r268407 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/lambda.c | 3 +++ libgomp/ChangeLog | 5 +++++ libgomp/testsuite/libgomp.c++/pr88988.C | 28 +++++++++++++++++++++++++ 4 files changed, 42 insertions(+) create mode 100644 libgomp/testsuite/libgomp.c++/pr88988.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4b909518858..29d87422369 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2019-01-30 Jakub Jelinek + + PR c++/88988 + * lambda.c (is_capture_proxy): Don't return true for + DECL_OMP_PRIVATIZED_MEMBER artificial vars. + 2019-01-30 Marek Polacek PR c++/89119 - ICE with value-initialization in template. diff --git a/gcc/cp/lambda.c b/gcc/cp/lambda.c index bc64a4173f9..4b7a358a0ad 100644 --- a/gcc/cp/lambda.c +++ b/gcc/cp/lambda.c @@ -263,6 +263,9 @@ is_capture_proxy (tree decl) && !DECL_ANON_UNION_VAR_P (decl) && !DECL_DECOMPOSITION_P (decl) && !DECL_FNAME_P (decl) + && !(DECL_ARTIFICIAL (decl) + && DECL_LANG_SPECIFIC (decl) + && DECL_OMP_PRIVATIZED_MEMBER (decl)) && LAMBDA_FUNCTION_P (DECL_CONTEXT (decl))); } diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog index e774e7fc1ae..4d1eca4d75d 100644 --- a/libgomp/ChangeLog +++ b/libgomp/ChangeLog @@ -1,3 +1,8 @@ +2019-01-30 Jakub Jelinek + + PR c++/88988 + * testsuite/libgomp.c++/pr88988.C: New test. + 2019-01-28 Jakub Jelinek PR middle-end/89002 diff --git a/libgomp/testsuite/libgomp.c++/pr88988.C b/libgomp/testsuite/libgomp.c++/pr88988.C new file mode 100644 index 00000000000..9dea35d15fe --- /dev/null +++ b/libgomp/testsuite/libgomp.c++/pr88988.C @@ -0,0 +1,28 @@ +// PR c++/88988 +// { dg-do compile } +// { dg-additional-options "-std=c++14" } + +extern "C" void abort (); + +template +struct A { + A () : a(), b() + { + [&] () + { +#pragma omp task firstprivate (a) shared (b) + b = ++a; +#pragma omp taskwait + } (); + } + + T a, b; +}; + +int +main () +{ + A x; + if (x.a != 0 || x.b != 1) + abort (); +}