void foo (void) { int i; i = 0; #pragma omp parallel shared (i) { #pragma omp master i++; #pragma omp parallel for for (i = 0; i < 10; i++) ; } } results in very weird omplower dump: 1) #pragma omp parallel shared(iD.1922) private(iD.1922) for the outer parallel (surely we don't want i being shared and private at the same time, just shared here) 2) #pragma omp parallel shared(iD.1922) for the inner parallel - in this case i certainly ought to be private, not shared I think 1) is caused by n->value = GOVD_PRIVATE; messing up outer context, while 2) probably because omp_is_private shouldn't recurse over is_parallel contexts.
Created attachment 11360 [details] pr27388.patch Something like this cures this but I'm really not sure what exactly is omp_is_private supposed to do. Richard, can you please look at this?
omp_is_private is supposed to prevent extra PRIVATE clauses from being added when they're not needed -- since each PRIVATE clause results in a new decl being created. I believe your patch is correct.
Subject: Bug 27388 Author: jakub Date: Thu May 4 06:34:06 2006 New Revision: 113514 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=113514 Log: PR middle-end/27388 * gimplify.c (omp_is_private): If var is shared in some outer context, return false instead of true. Stop searching on parallel context boundary. * gcc.dg/gomp/pr27388-1.c: New test. * gcc.dg/gomp/pr27388-2.c: New test. * gcc.dg/gomp/pr27388-3.c: New test. Added: trunk/gcc/testsuite/gcc.dg/gomp/pr27388-1.c trunk/gcc/testsuite/gcc.dg/gomp/pr27388-2.c trunk/gcc/testsuite/gcc.dg/gomp/pr27388-3.c Modified: trunk/gcc/ChangeLog trunk/gcc/gimplify.c trunk/gcc/testsuite/ChangeLog
Fixed in SVN.