From 310e44721056e49ef306847d4dc128cd9b736077 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Mon, 19 Apr 2010 23:51:28 +0200 Subject: [PATCH] re PR fortran/43339 (Incorrect output for pgm checking data sharing attributes) PR fortran/43339 * openmp.c (gfc_resolve_do_iterator): Only make iteration vars for sequential loops private in the innermost containing task region. * gfortran.dg/gomp/sharing-2.f90: Adjust for iteration vars of sequential loops being private only in the innermost containing task region. From-SVN: r158528 --- gcc/fortran/ChangeLog | 6 ++++ gcc/fortran/openmp.c | 29 ++++++++++---------- gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gfortran.dg/gomp/sharing-2.f90 | 12 ++++---- 4 files changed, 31 insertions(+), 21 deletions(-) diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 61297f9f12c..b9a4ebbcbd0 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2010-04-19 Jakub Jelinek + + PR fortran/43339 + * openmp.c (gfc_resolve_do_iterator): Only make iteration vars for + sequential loops private in the innermost containing task region. + 2010-04-18 Eric Botcazou * f95-lang.c (gfc_init_decl_processing): Remove second argument in call diff --git a/gcc/fortran/openmp.c b/gcc/fortran/openmp.c index d60121c5929..c00e1b41e28 100644 --- a/gcc/fortran/openmp.c +++ b/gcc/fortran/openmp.c @@ -1,5 +1,5 @@ /* OpenMP directive matching and resolving. - Copyright (C) 2005, 2006, 2007, 2008 + Copyright (C) 2005, 2006, 2007, 2008, 2010 Free Software Foundation, Inc. Contributed by Jakub Jelinek @@ -1367,7 +1367,6 @@ gfc_resolve_omp_parallel_blocks (gfc_code *code, gfc_namespace *ns) void gfc_resolve_do_iterator (gfc_code *code, gfc_symbol *sym) { - struct omp_context *ctx; int i = omp_current_do_collapse; gfc_code *c = omp_current_do_code; @@ -1386,21 +1385,21 @@ gfc_resolve_do_iterator (gfc_code *code, gfc_symbol *sym) c = c->block->next; } - for (ctx = omp_current_ctx; ctx; ctx = ctx->previous) + if (omp_current_ctx == NULL) + return; + + if (pointer_set_contains (omp_current_ctx->sharing_clauses, sym)) + return; + + if (! pointer_set_insert (omp_current_ctx->private_iterators, sym)) { - if (pointer_set_contains (ctx->sharing_clauses, sym)) - continue; + gfc_omp_clauses *omp_clauses = omp_current_ctx->code->ext.omp_clauses; + gfc_namelist *p; - if (! pointer_set_insert (ctx->private_iterators, sym)) - { - gfc_omp_clauses *omp_clauses = ctx->code->ext.omp_clauses; - gfc_namelist *p; - - p = gfc_get_namelist (); - p->sym = sym; - p->next = omp_clauses->lists[OMP_LIST_PRIVATE]; - omp_clauses->lists[OMP_LIST_PRIVATE] = p; - } + p = gfc_get_namelist (); + p->sym = sym; + p->next = omp_clauses->lists[OMP_LIST_PRIVATE]; + omp_clauses->lists[OMP_LIST_PRIVATE] = p; } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d29867544e4..dbde6351fac 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2010-04-19 Jakub Jelinek + PR fortran/43339 + * gfortran.dg/gomp/sharing-2.f90: Adjust for iteration vars + of sequential loops being private only in the innermost containing + task region. + PR middle-end/43337 * gfortran.dg/gomp/pr43337.f90: New test. diff --git a/gcc/testsuite/gfortran.dg/gomp/sharing-2.f90 b/gcc/testsuite/gfortran.dg/gomp/sharing-2.f90 index aede06c9c0f..b7d7e072975 100644 --- a/gcc/testsuite/gfortran.dg/gomp/sharing-2.f90 +++ b/gcc/testsuite/gfortran.dg/gomp/sharing-2.f90 @@ -28,10 +28,10 @@ end do !$omp end single !$omp end parallel -!$omp parallel default (none) shared (a) - i = 1 - j = 1 - k = 1 +!$omp parallel default (none) shared (a) ! { dg-error "enclosing parallel" } + i = 1 ! { dg-error "not specified in" } + j = 1 ! { dg-error "not specified in" } + k = 1 ! { dg-error "not specified in" } !$omp parallel default (none) shared (a) i = 1 j = 1 @@ -68,8 +68,8 @@ a(i, 1) = i + 1 end do !$omp end parallel -!$omp parallel default (none) shared (a) - i = 1 +!$omp parallel default (none) shared (a) ! { dg-error "enclosing parallel" } + i = 1 ! { dg-error "not specified in" } !$omp parallel default (none) shared (a, i) i = 2 !$omp parallel default (none) shared (a)